为了使用基于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中,是否需要水平或垂直扩展?从感觉水平,不是吗?