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,“不是正确的元组”);
禁止获取构造函数的地址,但我只想知道指针的类型
- 是否有其他方法确定此类指针的类型李>
- 否则,是否有另一种获取构造函数类型的方法
在我们获得对
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我还没有找到实现这一点的方法。它必须以某种方式由类型提供。我选择了一种特性。