Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::static_访问者多访问者非变量参数_C++_C++11_C++14_Boost Variant - Fatal编程技术网

C++ boost::static_访问者多访问者非变量参数

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是函数模板,它允许将一个参数作为引用传递给访问者(

在应用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
是函数模板,它允许将一个参数作为引用传递给访问者(通过封装到一些
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;
}