C++获取构造函数的类型
C++ obtaining the type of a constructor
我试图推断类构造函数参数的类型。我已经成功地获取了成员方法的参数类型,但我的方法对于构造函数失败了,因为它依赖于获取指向成员方法的指针的类型。
#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");
禁止获取构造函数的地址,但我只想知道指针的类型。
- 有没有另一种方法可以确定这种指针的类型?
- 否则,有没有另一种获取构造函数类型的方法?
有一个解决方案允许您获取构造函数参数类型。
注意:它发现第一个 ctor 具有明确且最短的参数集。
看看我这里的例子:https://godbolt.org/z/FxPDgU
在您的示例中,语句 refl::as_tuple<foo>
将导致std::tuple<int, double>
。拥有此元组类型后,您可以随心所欲地使用foo
类型实例化。
上面的代码基于一种解决方案,用于确定用于聚合初始化扩展以处理用户定义的 ctor 的类型。
相关资料:
-
http://alexpolt.github.io/type-loophole.html
https://github.com/alexpolt/luple/blob/master/type-loophole.h
作者:亚历山大·波尔塔夫斯基,http://alexpolt.github.io
-
https://www.youtube.com/watch?v=UlNUNxLtBI0
更好的C++14反思 - 安东尼·波卢欣 - 2018 C++会议
没有办法将构造函数称为函数。该标准非常明确地指出构造函数没有名称。不能采用构造函数的地址。
另一种方法是要求任何类型的机器一起使用,它具有提供元组或与构造函数对应的相关特征类型。
在我们获得对decltype
的语言支持之前,我记得用于查找函数结果类型的 Boost 功能依赖于可能类型的注册方案。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 构造函数正在调用一个使用当前类类型的函数
- 如何修复函数样式强制转换或类型构造的预期"("?
- 具有默认模板类型的默认构造函数的类型推导
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 不命名构造函数和析构函数上的类型错误
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 初始化自定义类型构造函数的数组
- OpenGL着色器错误C1068:类型构造函数中的数据过多
- Lambda 闭包类型构造函数
- 仅当基础类型具有模板类型构造函数时,才实现这些构造函数
- 模板类的构造函数在使用 new 关键字时调用类型构造函数
- 如何强制函数参数为相同类型,并且不允许使用类型构造函数与给定类型匹配
- 模板类型构造函数参数
- 它们是c++中的类型构造函数
- 解析C++类型构造函数