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

时间:2014-08-02 01:22:15

标签: c++ boost

如何检索用于构造某个类的模板参数的数量?为了澄清我之后的内容,让我们说我有一些类实例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的紧凑型解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

让我们在你的例子中使用字符串(为了清楚起见,用空格):

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

当然你为初始类型添加一个。