我正在创建一个跨平台的库,在几个平台上实现几个基本原语。为了验证基元(即类)的每个实现都提供了所有平台上所需的核心成员,我使用以下结构:
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 ++中是否有类似的语法来声明指向构造函数的指针?如果类没有提供给定的构造函数,我想要一个导致编译时错误的语句参数类型。
答案 0 :(得分:10)
你无法获取构造函数的地址,但你可以 如果无法使用a构造对象,则很容易出现编译时错误 给定的一组参数:
typedef int dummyToTriggerError[ sizeof( T( arg1, arg2, arg3 ) ) ];
当然,关键部分是sizeof
表达式
包含永远不会被评估的对象的结构,但是
这必须是合法的。它被包裹在typedef
中以确保它
永远不会生成任何代码。
答案 1 :(得分:3)
不,你不能指向构造函数。
确保提供特定构造函数的方法是在非执行上下文中模拟对构造函数的调用(例如sizeof
):
static_assert(sizeof(className(std::declval<arg1_type>(), std::declval<arg2_type>())) > 0, "");