2012-08-01 106 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, "");