C++ C++;获取构造函数的类型

C++ C++;获取构造函数的类型,c++,templates,type-deduction,C++,Templates,Type Deduction,我试图推断类的构造函数参数的类型。我已经成功地获取了成员方法的参数类型,但是我的方法对于构造函数失败了,因为它依赖于获取指向成员方法的指针的类型 #include <tuple> #include <type_traits> // Some type with a constructor struct foo { foo(int, double) {} void test(char, char) {}; }; // Extract the first

我试图推断类的构造函数参数的类型。我已经成功地获取了成员方法的参数类型,但是我的方法对于构造函数失败了,因为它依赖于获取指向成员方法的指针的类型

#include <tuple>
#include <type_traits>

// Some type with a constructor
struct foo {
    foo(int, double) {}
    void test(char, char) {};
};

// Extract the first parameter
template<class T>
struct func_traits {};

template<class Return, class Type, class ... Params>
struct func_traits<Return(Type::*)(Params...)> {
    using params = std::tuple<Params...>;
};

// Get the parameters for foo::test
using test_type = decltype(&foo::test);
using test_params = typename func_traits<test_type>::params;
static_assert(std::is_same<test_params, std::tuple<char, char>>::value, "Not the right tuple");

// Get the parameters for foo::foo
using ctor_type = decltype(&foo::foo);  // Forbidden
using ctor_type = typename func_traits<ctor_type>::params;
static_assert(std::is_same<ctor_type, std::tuple<int, double>>::value, "Not the right tuple");
#包括
#包括
//具有构造函数的某个类型
结构foo{
foo(int,double){}
孔隙测试(char,char){};
};
//提取第一个参数
模板
结构函数{};
模板
结构函数特性{
使用params=std::tuple;
};
//获取foo::test的参数
使用test_type=decltype(&foo::test);
使用test_params=typename func_traits::params;
静态断言(std::is_same::value,“不是正确的元组”);
//获取foo::foo的参数
使用ctor_type=decltype(&foo::foo);//被禁止的
使用ctor_type=typename func_traits::params;
静态断言(std::is_same::value,“不是正确的元组”);
禁止获取构造函数的地址,但我只想知道指针的类型

  • 是否有其他方法确定此类指针的类型
  • 否则,是否有另一种获取构造函数类型的方法

无法将构造函数称为函数。该标准非常明确地规定构造函数没有名称。您不能获取构造函数的地址

另一种方法可能是要求任何类型与某些机器一起使用,即它具有一个关联的traits类型,该类型提供元组或与构造函数相对应的内容


在我们获得对
decltype
的语言支持之前,我记得Boost功能用于查找依赖于可能类型的注册方案的函数的结果类型。

无法将构造函数作为函数引用。该标准非常明确地规定构造函数没有名称。您不能获取构造函数的地址

另一种方法可能是要求任何类型与某些机器一起使用,即它具有一个关联的traits类型,该类型提供元组或与构造函数相对应的内容


在我们获得对
decltype
的语言支持之前,我记得Boost功能用于查找依赖于可能类型的注册方案的函数的结果类型。

有一种解决方案允许您获取构造函数参数类型

注意:它发现第一个ctor具有明确且最短的参数集

看看我的例子:

在您的示例中,语句
refl::as_tuple
将导致
std::tuple
。一旦有了这个元组类型,您就可以随心所欲,包括
foo
类型实例化

上面的代码基于一个解决方案,用于确定用于聚合init的类型,该聚合init扩展为处理用户定义的构造函数

有关资料:

  • 亚历山大·波尔塔夫斯基

  • 更好的C++ 14反射-安东尼Pulkuin -满足C++ 2018<P><


    有一种解决方案允许您获取构造函数参数类型

    注意:它发现第一个ctor具有明确且最短的参数集

    看看我的例子:

    在您的示例中,语句
    refl::as_tuple
    将导致
    std::tuple
    。一旦有了这个元组类型,您就可以随心所欲,包括
    foo
    类型实例化

    上面的代码基于一个解决方案,用于确定用于聚合init的类型,该聚合init扩展为处理用户定义的构造函数

    有关资料:

  • 亚历山大·波尔塔夫斯基

  • 更好的C++ 14反射-安东尼Pulkuin -满足C++ 2018<P><


    您现有的代码是否可以处理重载函数?@KerrekSB如果您指定重载,那么它可以工作,但在这种情况下,您已经知道参数,因此这是没有意义的。我假设我会遇到重载问题,但我还没有解决。对于确认(或否定)是否可以用给定签名构造类型的类型特征来说,这足够好吗?目前,答案是否定的。构造函数没有名称,也不能使用其地址。有人提到了一个想法,提出了一个神奇的类型特性,它将类的构造函数作为一组函数调用操作符重载公开,但这并没有(目前)实现。@Sergey.quixoticaxis.Ivanov我还没有找到实现这一点的方法。它必须以某种方式由类型提供。我选择了专门化一个特性。您现有的代码是否可以处理重载函数?@KerrekSB如果您指定重载,它可以工作,但在这种情况下,您已经知道参数,因此这是没有意义的。我假设我会遇到重载问题,但我还没有解决。对于确认(或否定)是否可以用给定签名构造类型的类型特征来说,这足够好吗?目前,答案是否定的。构造函数没有名称,也不能使用其地址。有人提到了一个想法,提出了一个神奇的类型特性,它将类的构造函数作为一组函数调用操作符重载公开,但这并没有(目前)实现。@Sergey.quixoticaxis.Ivanov我还没有找到实现这一点的方法。它必须以某种方式由类型提供。我选择了一种特性。