如何找到用于声明类的模板参数的数量?
How do I find the number of template arguments used to declare a class?
如何检索用于构造某些类的模板参数的数量?为了澄清我所追求的内容,假设我有一些类实例A a;
,并运行以下命令来获取其名称:
boost::units::detail::demangle(typeid(decltype(a)).name())
假设这个调用的输出是someNamespace::A<Arg1<A,B>,int,5,Arg2<C,D>>
。我想找到一种可靠地获得参数数量的方法。4
),考虑到参数本身可能有任何级别的嵌套模板参数本身(我不想计数-即。我想将Arg1<A,B>
作为单个参数),并且参数可以是类型和值的任何组合。
我对手动字符串摔跤持开放态度,但我更喜欢使用boost
/STL的紧凑解决方案。
任何想法?
让我们以示例中的字符串为例(为清晰起见使用空白):
someNamespace::A< Arg1<A,B>, int, 5, Arg2<C,D> >
您希望从中得到"4",因为模板中有四个顶级类型。最可靠的方法是将其视为一种语法。我们可以使用Boost Spirit(警告:很难获得正确,如果你有编译器错误,上帝会帮助你)。我们可以使用ANTLR或flex/bison为这种小语言生成解析器。如果我们这样做,我们的目标是生成一个AST,其中包含四个类型子节点作为兄弟节点(其中两个包含它们自己的子节点和)。
但是也许手写的解析器更容易。从左到右,你可以保存一个计数器,显示你包含了多少个尖括号:
someNamespace::A< Arg1<A,B>, int, 5, Arg2<C,D> >
000000000000000011111122221111111111111112222110
那么当括号计数为1时,只需计算逗号:
someNamespace::A< Arg1<A,B>, int, 5, Arg2<C,D> >
000000000000000011111122221111111111111112222110
1 2 3
当然可以为初始类型添加一个
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用在用于SFINAE的void_t中具有参数的方法
- 用于检查值是否为其任何参数的帮助程序函数
- 为什么可变参数函数不适用于模板
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 一个模板方法,用于同时接受常量和非常量参数
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 使用一个参数的模板函数时出错(适用于 2)
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- 隐式生成的函数重载用于右值参数?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 将非 const 对象用于 const 参数
- 我可以将模板中的类型参数用于非类型参数吗?
- opencl openGL互操作内核参数用于读取 写入
- 分配参数用于测试目的
- 将命令行参数用于输入参数
- 如何使用类的属性作为模板参数/用于专用化
- 为什么我不能将此参数用于 std::sort() 的比较?
- 模板类参数用于模板类函数语法
- 为什么 GCC 不允许我将模板参数用于另一个模板的参数?