我是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>
中的逗号会引起麻烦。如果我的类(class)不是模板类,则可以在typedef std::map<T,U> M
内执行Foo
,并且可以在BOOST_FUSION_ADAPT_STRUCT
内编写(Foo::M, m)
。但是,由于Foo
是模板类,所以我不知道如何使其工作。我在网上看到有一些技巧可以防止将逗号视为宏中的分隔符。例如,有些人使用
#define COMMA ,
并在COMMA
中使用std::map<T COMMA U>
。但这在这里不起作用。我不太确定,但我认为COMMA
在通过BOOST_FUSION_ADAPT_TPL_STRUCT调用的其他BOOST宏之前已经转换为“”。有人建议使用括号来封装类型。但这在这里不起作用,因为这需要宏来处理括号并提取类型。 (我真的不熟悉宏,所以如果我错了,请告诉我)任何帮助将不胜感激!非常感谢你。
最佳答案
#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