BOOST_FUSION_ADAPT_TPL_STRUCT和模板成员

BOOST_FUSION_ADAPT_TPL_STRUCT with template members

本文关键字:成员 TPL FUSION ADAPT BOOST STRUCT      更新时间:2023-10-16

我是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>中的逗号会引起麻烦。如果我的类不是模板类,我可以在Foo中执行typedef std::map<T,U> M,在BOOST_FUSION_ADAPT_STRUCT中编写(Foo::M, m)。然而,由于Foo是一个模板类,我不知道如何使它工作。

我在网上看到有一些技巧可以防止逗号在宏中被当作分隔符。例如,有些人在std::map<T COMMA U>中使用#define COMMA ,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)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^            ~^^~  
)

DEMO