【发布时间】:2015-11-04 11:57:01
【问题描述】:
我是 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 和BOOST_FUSION_ADAPT_STRUCT 里面写typedef std::map<T,U> M,我可以写(Foo::M, m)。但是,Foo 是一个模板类,我不知道如何使它工作。
我在网上看到有一些技巧可以防止逗号在宏中被视为分隔符。比如有些人使用#define COMMA ,,在std::map<T COMMA U>中使用COMMA。然而,这在这里不起作用。我不太确定,但我认为COMMA 在通过 BOOST_FUSION_ADAPT_TPL_STRUCT 调用的其他 BOOST 宏之前已经转换为“,”。有人建议使用括号来封装类型。但这在这里不起作用,因为这需要宏来处理括号并提取类型。 (我对宏真的不熟悉,所以如果我错了请告诉我)
任何帮助将不胜感激!非常感谢。
【问题讨论】:
标签: c++ templates boost macros boost-fusion