C++ boost::static_访问者多访问者非变量参数
在应用multivisitor时,除了传递变量类型的参数外,还有什么便宜的方法传递非变量类型的参数吗 我所说的“昂贵方式”是指:C++ boost::static_访问者多访问者非变量参数,c++,c++11,c++14,boost-variant,C++,C++11,C++14,Boost Variant,在应用multivisitor时,除了传递变量类型的参数外,还有什么便宜的方法传递非变量类型的参数吗 我所说的“昂贵方式”是指: #包括 #包括 #包括 结构A{}; 结构B{}; 枚举类C{X,Y}; std::ostream& 操作员您希望API是怎样的?你能给出一个你想如何使用它的例子吗?类似于boost::apply\u visitor(v,make\u non\u variant(C::X),a)。其中,make_non_variant是函数模板,它允许将一个参数作为引用传递给访问者(
#包括
#包括
#包括
结构A{};
结构B{};
枚举类C{X,Y};
std::ostream&
操作员您希望API是怎样的?你能给出一个你想如何使用它的例子吗?类似于boost::apply\u visitor(v,make\u non\u variant(C::X),a)
。其中,make_non_variant
是函数模板,它允许将一个参数作为引用传递给访问者(通过封装到一些non_variant_wrapper
类型实例中)。我也很喜欢这样!“你在这个问题上学到了什么新东西吗?”迪米特里查克曼我发明并使用了我自己的多重访问者。要使其与boost::variant
兼容并不难:只需更改实现,或者为is_variant
类型特性添加专门化。
#include <boost/variant.hpp>
#include <iostream>
#include <cstdlib>
struct A {};
struct B {};
enum class C { X, Y };
std::ostream &
operator << (std::ostream & out, C const c)
{
switch (c) {
case C::X : {
return out << "C::X";
}
case C::Y : {
return out << "C::Y";
}
default : {
break;
}
}
throw std::runtime_error("unknown C value");
}
using V = boost::variant< A, B >;
struct S
: boost::static_visitor<>
{
void
operator () (C const c, A const &) const
{
std::cout << c << " A" << std::endl;
}
void
operator () (C const c, B const &) const
{
std::cout << c << " B" << std::endl;
}
};
int main()
{
V const a = A{};
V const b = B{};
using VC = boost::variant< C >;
VC const x = C::X;
VC const y = C::Y;
S const s;
boost::apply_visitor(s, x, a);
boost::apply_visitor(s, y, a);
boost::apply_visitor(s, x, b);
boost::apply_visitor(s, y, b);
return EXIT_SUCCESS;
}