2015-11-04 121 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