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



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

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

在命名空间中添加内容 stdUndefined Behavior。

在外部命名空间中添加东西是不行的,即使合法。 但它无论如何都不能解决您的 ADL 问题(template <typename T> std::ostream &operator<<(std::ostream&, const std::vector<T>&);只将 std用于 ADL(以及命名空间用于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);

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

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

相关内容

  • 没有找到相关文章

最新更新