3
std::variant
の場合はoperator<<
と書いておきます。特定のバリアントのoperator<<
は、operator<<
がそのバリアントが含むことができるすべてのタイプに対して有効な場合にのみ有効であるという前提があります。std :: variantにoperator <<を書くにはどうすればいいですか?
std::variant
の場合はoperator<<
と書いておきます。特定のバリアントのoperator<<
は、operator<<
がそのバリアントが含むことができるすべてのタイプに対して有効な場合にのみ有効であるという前提があります。std :: variantにoperator <<を書くにはどうすればいいですか?
//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... Ts>
std::ostream& operator<<(std::ostream& os, const std::variant<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';
}
これはstd::visit
に、一般的なラムダを渡すことに依存しています。
'template std :: ostream&operator <<(std :: ostream&os、const std :: variant &v)'を使用できませんか? –
Caleth
@カルテ:はい!回答が編集されました。ありがとう! –