使用boost预处理器生成访问者重载

时间:2017-05-24 11:48:33

标签: boost boost-preprocessor

为了使用基于lambda的访问者访问变体,我来到boost.preprocessor来生成所需的样板:

#include <boost/preprocessor.hpp>

#define MY_OVERLOAD(r, data, elem) \
    [](elem const& t) { return false; },

#define MY_OVERLOAD_SEQ_MEMBER(typeSeq) \
    BOOST_PP_SEQ_FOR_EACH(MY_OVERLOAD, ~, typeSeq)

#define MY_OVERLOAD_MEMBER(typeSeq) \
    MY_OVERLOAD_SEQ_MEMBER(typeSeq)


int main()
{
    auto visitor = hana::overload(
#if 0   // like to have:
        [](int t) { return false; },
        [](double t) { return false; },
        [](std::string const& t) { false; }
#else
        MY_OVERLOAD_MEMBER((int)(double)(std::string))
#endif
    );
    ...
}

到目前为止,这会按预期扩展,但在最后一个元素失败 - 有一个无法编译的尾随逗号。我知道BOOST_PP_COMMA_IF,BOOST_PP_ENUM ......确实需要生成的元素数量。但这不适用于我的用例 - 类型列表对于每种类型的访问者来说当然是不同的。此外,我不限制以这里显示的方式列出参数,逗号分隔列表作为宏参数也足够......

另请注意,此代码仅显示我想要使用的概念 - 实际上我不想通过引用来捕获POD。

顺便说一句;在boost.preprocessor中,是否需要水平或垂直扩展?从感觉水平,不是吗?

0 个答案:

没有答案