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