如何找到用于声明类的模板参数的数量?

How do I find the number of template arguments used to declare a class?

本文关键字:参数 用于 声明 何找      更新时间:2023-10-16

如何检索用于构造某些类的模板参数的数量?为了澄清我所追求的内容,假设我有一些类实例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

当然可以为初始类型添加一个