gpt4 book ai didi

c++ - BOOST_FUSION_ADAPT_TPL_STRUCT 与模板成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:00 24 4
gpt4 key购买 nike

我是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 将其作为 fusion :

    BOOST_FUSION_ADAPT_TPL_STRUCT
(
(T)(U),
(FOO)(T)(U),
(unsigned, n),
(std::string, s),
(std::map<T,U>, m)
)

我知道这不起作用,因为 map<T,U> 中的逗号会引起麻烦。如果我的类不是模板类,我可以做 typedef std::map<T,U> M里面FooBOOST_FUSION_ADAPT_STRUCT 里面我可以写(Foo::M, m) .然而,作为 Foo是一个模板类,我不知道如何让它工作。

我在网上看到有一些技巧可以防止逗号在宏中被视为分隔符。例如,有些人使用 #define COMMA ,并使用 COMMAstd::map<T COMMA U> .然而,这在这里不起作用。我不太确定,但我认为 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

关于c++ - BOOST_FUSION_ADAPT_TPL_STRUCT 与模板成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33521288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com