2015-11-04 115 views
2

我是新来的StackOverflow和新的编写宏的C++,请原谅我,如果这个问题太天真了。BOOST_FUSION_ADAPT_TPL_STRUCT模板成员

我写了一个模板类,像这样:

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里面做typedef std::map<T,U> M,在BOOST_FUSION_ADAPT_STRUCT里面我可以写(Foo::M, m)。但是,由于Foo是一个模板类,我不知道如何使其工作。

我在网上看到有一些技巧可以防止逗号在宏中作为分隔符。例如,有些人使用#define COMMA ,并在std::map<T COMMA U>中使用COMMA。然而这在这里不起作用。我不是很确定,但我认为COMMA已经在通过BOOST_FUSION_ADAPT_TPL_STRUCT调用的其他BOOST宏之前转换为“,”。有人建议使用括号来封装类型。但是这不起作用,因为这需要宏处理括号并提取类型。 (我真的不熟悉宏,所以请让我知道如果我错了)

任何帮助将不胜感激!非常感谢你。

+0

[以下是几种可能性(http://stackoverflow.com/questions/32314575/q-declare-metatype-a-boostmulti-array/32314727#32314727) –

回答

1
#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

+0

非常感谢你许多! – user3513512