【问题标题】:Syntax for pointers to constructors in C++C++ 中指向构造函数的指针的语法
【发布时间】:2012-07-30 05:24:33
【问题描述】:

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

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++ 中是否有类似的语法来声明指向构造函数的指针?如果类不提供给定的构造函数,我想要一个导致编译时错误的语句参数类型。

【问题讨论】:

标签: c++


【解决方案1】:

你无法获取构造函数的地址,但你可以 如果一个对象不能用 给定一组参数:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2013-03-07
      • 2021-01-26
      相关资源
      最近更新 更多