我是StackOverflow新手,刚开始用c++编写宏,如果这个问题太天真,请原谅我。
我编写了这样一个模板类:
template<typename T, typename U>
class Foo
{
public:
unsigned n;
std::string s;
std::map<T,U> m;
}我想使用BOOST_FUSION_ADAPT_TPL_STRUCT将其作为融合:
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宏。有些人建议使用括号来封装类型。但是这在这里不起作用,因为这需要宏来处理括号并提取类型。(我真的不熟悉宏,所以如果我错了,请告诉我)
任何帮助都将不胜感激!非常感谢。
发布于 2015-11-04 12:09:00
#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
https://stackoverflow.com/questions/33521288
复制相似问题