首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有模板成员的BOOST_FUSION_ADAPT_TPL_STRUCT

带有模板成员的BOOST_FUSION_ADAPT_TPL_STRUCT
EN

Stack Overflow用户
提问于 2015-11-04 11:57:01
回答 1查看 222关注 0票数 3

我是StackOverflow新手,刚开始用c++编写宏,如果这个问题太天真,请原谅我。

我编写了这样一个模板类:

代码语言:javascript
复制
    template<typename T, typename U>
    class Foo
    {
    public:
      unsigned n;
      std::string s;
      std::map<T,U> m;
    }

我想使用BOOST_FUSION_ADAPT_TPL_STRUCT将其作为融合:

代码语言:javascript
复制
    BOOST_FUSION_ADAPT_TPL_STRUCT
    (
      (T)(U),
      (FOO)(T)(U),
      (unsigned, n),
      (std::string, s),
      (std::map<T,U>, m)
    )

我知道这不起作用,因为map<T,U>内部的逗号会引起麻烦。如果我的类不是模板类,我可以在Foo中执行Foo,在BOOST_FUSION_ADAPT_STRUCT中可以编写(Foo::M, m)。但是,由于Foo是一个模板类,我不知道如何使它工作。

我在网上看到了一些防止逗号在宏中作为分隔符处理的技巧。例如,有些人在#define COMMA ,中使用COMMA,在std::map<T COMMA U>中使用COMMA。然而,这在这里行不通。我不太确定,但我认为COMMA已经转换为“",然后再通过BOOST_FUSION_ADAPT_TPL_STRUCT调用的其他BOOST宏。有些人建议使用括号来封装类型。但是这在这里不起作用,因为这需要宏来处理括号并提取类型。(我真的不熟悉宏,所以如果我错了,请告诉我)

任何帮助都将不胜感激!非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-04 12:09:00

代码语言:javascript
复制
#include <boost/utility/identity_type.hpp>

BOOST_FUSION_ADAPT_TPL_STRUCT
(
  (T)(U),
  (Foo)(T)(U),
  (unsigned, n),
  (std::string, s),
  (typename BOOST_IDENTITY_TYPE((std::map<T,U>)), m)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^            ~^^~  
)

DEMO

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

https://stackoverflow.com/questions/33521288

复制
相关文章

相似问题

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