什么是使输出流运算符用于boost :: variant <std :: vector <int>,int,double>的正确方法是什么

时间:2018-08-06 19:41:02

标签: c++ c++11 boost boost-variant

boost::variant为其自身实现了流运算符。 问题是std::vector<>没有一个对象,但是boost::variant假设传递给boost::variant的每种类型都有一个实现。那么在哪里实现这个运算符呢?最好在不与其他人实现冲突的某些命名空间中。 据我了解,要么可以实现

template<typename T>
std::ostream &operator<<(std::ostream&, const std::vector<T>&);

std命名空间中或从中调用std::vector的流运算符的命名空间中-在这种情况下为boost::detail::variant

我都不喜欢。还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

在名称空间std中添加内容是 U 未定义 B 行为。

即使合法,也不能在外部名称空间中添加内容。但这仍然无法解决您的ADL问题(template <typename T> std::ostream &operator<<(std::ostream&, const std::vector<T>&);仅对ADL使用std(对T使用命名空间)

脆弱的解决方法是将其放在全局名称空间中,但随后必须在增强operator <<定义之前将其包括在内:-/

或者,您可以使用常规方式处理variant并使用访问者:

struct Printer
{
    template <typename T>
    void operator() (const T& e) const { std::cout << e; }

    template <typename T>
    void operator() (const std::vector<T>& v) const
    {
        // Your implementation, such as
        for (const auto& e : v) {
            std::cout << e << std::endl;
        }
    }

};


boost::visit(Printer{}, my_variant);

答案 1 :(得分:0)

您只能为特定类型覆盖operator<<

template<typename ...Args>
std::ostream &operator <<(std::ostream &out, boost::variant<std::vector<int>, Args...> t);