且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何操作符<与boost :: variant实现

更新时间:2022-06-16 09:21:49

Boost有 apply_visitor 函数,它接受一个通用函数对象和将变体的类型传递给它。因此,实现运算符<< 非常简单:

Boost has an apply_visitor function, that takes a generic function object and passes the type of the variant into it. So implementing operator<< is as straightforward as:

template <class... Ts>
std::ostream& operator<<(std::ostream& os, boost::variant<Ts...> const& var) {
    return boost::apply_visitor(ostream_visitor{os}, var);
}

与:

struct ostream_visitor : boost::static_visitor<std::ostream&>
{
    std::ostream& os;

    template <class T>
    std::ostream& operator()(T const& val) {
        return os << val;
    }
};

或者:

template <class... Ts>
std::ostream& operator<<(std::ostream& os, boost::variant<Ts...> const& var) {
    return boost::apply_visitor([&os](const auto& val) -> std::ostream& {
        return os << val;
    }, var);
}

您可以在教程