簡體   English   中英

BOOST_FUSION_ADAPT_TPL_STRUCT 與模板成員

[英]BOOST_FUSION_ADAPT_TPL_STRUCT with template members

我是 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>的逗號會引起麻煩。 如果我的類不是模板類,我可以在FooBOOST_FUSION_ADAPT_STRUCT內部執行typedef std::map<T,U> M我可以寫(Foo::M, m) 但是,由於Foo是一個模板類,我不知道如何使其工作。

我在網上看到有一些技巧可以防止將逗號視為宏中的分隔符。 例如,有些人使用#define COMMA ,並在std::map<T COMMA U>使用COMMA 然而,這在這里不起作用。 我不太確定,但我認為在通過 BOOST_FUSION_ADAPT_TPL_STRUCT 調用的其他 BOOST 宏之前, COMMA已經轉換為“,”。 有人建議使用括號來封裝類型。 但這在這里不起作用,因為這需要宏來處理括號並提取類型。 (我真的不熟悉宏,所以如果我錯了,請告訴我)

任何幫助將不勝感激! 非常感謝。

#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)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^            ~^^~  
)

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM