2017-10-23 9 views

答えて

2
//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'; 
} 

Demo

これはstd::visitに、一般的なラムダを渡すことに依存しています。

+4

'template std :: ostream&operator <<(std :: ostream&os、const std :: variant &v)'を使用できませんか? – Caleth

+0

@カルテ:はい!回答が編集されました。ありがとう! –