BOOST_FUSION_ADAPT_TPL_STRUCT 有模板成员
BOOST_FUSION_ADAPT_TPL_STRUCT with template members
我是Whosebug的新手,也是c++写宏的新手,如果这个问题太幼稚请见谅。
我写了一个这样的模板class:
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 不是模板 class,我可以在 Foo
中做 typedef std::map<T,U> M
,在 BOOST_FUSION_ADAPT_STRUCT
中我可以写 (Foo::M, m)
。但是,由于 Foo
是一个模板 class,我不知道如何让它工作。
我在网上看到有一些技巧可以防止逗号在宏中被当作分隔符。比如有人用#define COMMA ,
,在std::map<T COMMA U>
里用COMMA
。然而,这在这里不起作用。我不太确定,但我认为 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)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ~^^~
)
我是Whosebug的新手,也是c++写宏的新手,如果这个问题太幼稚请见谅。
我写了一个这样的模板class:
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 不是模板 class,我可以在 Foo
中做 typedef std::map<T,U> M
,在 BOOST_FUSION_ADAPT_STRUCT
中我可以写 (Foo::M, m)
。但是,由于 Foo
是一个模板 class,我不知道如何让它工作。
我在网上看到有一些技巧可以防止逗号在宏中被当作分隔符。比如有人用#define COMMA ,
,在std::map<T COMMA U>
里用COMMA
。然而,这在这里不起作用。我不太确定,但我认为 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)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ~^^~
)