我想为operator<<
撰写std::variant
。假设特定变体的operator<<
仅在operator<<
对变体可包含的所有类型有效时才有效。
答案 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';
}
这依赖于将通用lambda传递给std::visit
。
有关此答案以前版本的问题,请参阅this question。这个答案已经更新,以避免这个问题。