首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到用于声明类的模板参数的数量?

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

Stack Overflow用户
提问于 2014-08-02 01:22:15
回答 1查看 89关注 0票数 4

如何检索用于构造某个类的模板参数的数量?为了澄清我想要的是什么,假设我有一些类实例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的紧凑解决方案。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-02 02:26:43

让我们以示例中的字符串为例(为了清晰起见,使用空格):

代码语言:javascript
复制
someNamespace::A< Arg1<A,B>, int, 5, Arg2<C,D> >

您希望从中获得"4“,因为模板中有四种顶级类型。最有力的方法是把它看作是一种语法。我们可以使用助推精神(警告:很难得到正确,神帮助你,如果你有一个编译器错误)。我们可以使用ANTLR或好的旧flex/bison为小语言生成一个解析器。如果我们这样做的话,我们的目标是生成一个AST,其中包含四种类型的子级作为兄弟姐妹(其中两个包含自己的子级和)。

但是也许手写的解析器更容易。从左到右,您可以保存一个计数器,说明您在其中有多少个尖括号:

代码语言:javascript
复制
someNamespace::A< Arg1<A,B>, int, 5, Arg2<C,D> >
000000000000000011111122221111111111111112222110

那么,当括号计数为1时,只需计算逗号:

代码语言:javascript
复制
someNamespace::A< Arg1<A,B>, int, 5, Arg2<C,D> >
000000000000000011111122221111111111111112222110
                           1    2  3

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25090765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档