3

我正在制作一个跨平台库,在多个平台上实现几个基本原语。为了验证基元(即类)的每个实现是否提供所有平台所需的核心成员,我使用以下构造:

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);

所以如果 Event 类没有bool TryWait(unsigned)方法,我们会在这里得到一个编译错误。

问题是:在 C++ 中是否有类似的语法来声明指向构造函数的指针?如果类不提供具有给定参数类型的构造函数,我想要一个导致编译时错误的语句。

4

2 回答 2

10

您无法获取构造函数的地址,但如果无法使用给定的一组参数构造对象,则很容易出现编译时错误:

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

当然,最重要的部分是sizeof表达式,它包含一个永远不会被计算但必须是合法的对象的构造。它被包裹在 atypedef中,以确保它永远不会生成任何代码。

于 2012-08-01T10:22:21.373 回答
3

不,您不能将指针指向构造函数。

确保提供特定构造函数的方法是在非执行上下文中模拟对构造函数的调用(例如sizeof):

static_assert(sizeof(className(std::declval<arg1_type>(), std::declval<arg2_type>())) > 0, "");
于 2012-08-01T10:21:54.570 回答