如何编写运算符<<对于std :: variant?

时间:2017-10-23 15:26:48

标签: c++

我想为operator<<撰写std::variant。假设特定变体的operator<<仅在operator<<对变体可包含的所有类型有效时才有效。

1 个答案:

答案 0 :(得分:8)

//g++ (GCC) 7.2.0
//g++ -std=c++1z -O2 -Wall -pedantic -pthread main.cpp
#include <iostream>
#include <string>
#include <variant>
#include <complex>

template<typename T, typename... Ts>
std::ostream& operator<<(std::ostream& os, const std::variant<typename T, Ts...>& v)
{
    std::visit([&os](auto&& arg) {
        os << arg;
    }, v);
    return os;
}

int main()
{
    using namespace std::complex_literals;
    std::variant<int, std::string, double, std::complex<double>> v = 4;
    std::cout << v << '\n';
    v = "hello";
    std::cout << v << '\n';
    v = 3.14;
    std::cout << v << '\n';
    v = 2. + 3i;
    std::cout << v << '\n';
}

Demo

这依赖于将通用lambda传递给std::visit

有关此答案以前版本的问题,请参阅this question。这个答案已经更新,以避免这个问题。