如何捕获构造函数的原型?

时间:2019-05-03 02:09:41

标签: c++ templates constructor function-prototypes

通过使用可变参数模板,我可以轻松地捕获和枚举方法或函数的参数:

template<typename RT, typename ...Args>
class MyFunctor< RT (*)(Args ... args)>
{
    //Count the number of arguments
    static constexpr int const arity=sizeof ...(Args);

    //Create something to store the arguments in
    std::tuple<Args...> _arguments;

}

然后我可以创建模板方法,该方法可以遍历参数列表,并最终使用_agrument元组调用指向实函数的指针。

我知道构造函数是无名的,但是它们也没有类型吗?有没有一种方法可以获取构造函数的“类型”,使我可以执行与函数和方法相似的操作?

在C ++ 03中,我可以使用以下内容(使用GCC 3.3)捕获构造函数的类型:

TypeDefT< typeof( MyClass::MyClass(int i) ) *>

通过将指针语法放在typeof()语句之后,我可以将构造函数签名视为普通函数指针的类型。

然后我将添加一个create方法到FunctionPointer模板,然后仅用一个参数列表即可调用它,并且可能会发生新的MyClass(p1,p2,p3)。

但是,对于C ++ 17来说,似乎没有一种方法可以像我在C ++ 03中那样获得构造函数的类型,也没有像在C ++ 17中那样可以获得构造函数的类型。有没有办法做到这一点? ?

谢谢

1 个答案:

答案 0 :(得分:0)

构造函数没有类型。您是否注意到在声明构造函数时不允许编写返回类型?

不幸的是,没有办法获得指向构造函数的函数指针之类的东西。您的“ C ++ 03”解决方案不是标准的,GCC 3.3是一个非常的旧编译器;那时,GCC有许多不可移植的扩展,其中大部分已被删除。

您需要找到一种不同的方式来做您想做的实际事情。正如对该问题的评论所指出的那样,通用代码通常不需要“知道”构造函数的签名。