use*_*512 4 c++ macros templates boost boost-fusion
我是 StackOverflow 的新手,也是用 C++ 编写宏的新手,如果这个问题太天真,请原谅我。
我写了一个这样的模板类:
template<typename T, typename U>
class Foo
{
public:
unsigned n;
std::string s;
std::map<T,U> m;
}
Run Code Online (Sandbox Code Playgroud)
我想使用 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)
)
Run Code Online (Sandbox Code Playgroud)
我知道这不起作用,因为里面的逗号map<T,U>会引起麻烦。如果我的类不是模板类,我可以在I can write 的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)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ~^^~
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |