2012-08-01 275 views
3

我正在一個跨平臺的庫上實現幾個平臺上的幾個基本原語。要驗證原語(即類)的每一個執行提供了我使用下面的結構所有平臺所需的核心成員:C++構造函數指針的語法

template<typename _Ty> int _MethodVerifyHelper(_Ty); 
#define ENSURE_MEMBER_DECL(className, methodName, returnType, ...) typedef char __PROTOTYPE_VERIFIER__[sizeof(_MethodVerifyHelper<returnType (className::*)(__VA_ARGS__)>(&className::methodName))] 

然後,我寫的東西是這樣的:

ENSURE_MEMBER_DECL(Event, TryWait, bool, unsigned); 

因此,如果事件類沒有bool TryWait(unsigned)方法,我們會在這裏得到一個編譯錯誤。

現在的問題是:在C++中是否有類似的語法來聲明指向構造函數的指針?我想要一個聲明,如果一個類沒有提供給定參數類型的構造函數,會導致編譯時錯誤。

+0

[查看在編譯時類的構造函數簽名(http://stackoverflow.com/questions/949432/check-at-compile-time-class-constructor-signature) – 2012-08-01 10:22:11

+0

題外話的可能重複,但你不應該't使用[保留名稱](http://stackoverflow.com/questions/228783)像'_Ty'和'_MethodVerifyHelper'。 – 2012-08-01 10:58:59

回答

10

有沒有辦法可以採取的一個地址構造函數,但你可以 很容易地得到一個編譯時錯誤,如果一個對象無法與 組給定的參數來構建:

typedef int dummyToTriggerError[ sizeof(T(arg1, arg2, arg3)) ]; 

的重要組成部分,當然,該sizeof表達式,其中 包含將不會被評估的對象的構造,但是 必須合法。它被包裝在一個typedef中以確保其 不會生成任何代碼。

3

不,你不能把指針指向構造函數。

,以確保提供一個特定的構造將是模擬的非執行上下文(如sizeof)內部的構造函數的調用方式:

static_assert(sizeof(className(std::declval<arg1_type>(), std::declval<arg2_type>())) > 0, "");