c++ - 如何流式传输 std::variant<...,...>

标签 c++ stream c++17 variant

我的 std::variant包含可流类型:

std::variant<int, std::string> a, b;
a = 1;
b = "hi";
std::cout << a << b << std::endl;

使用 -std=c++1z 编译 g++7 会返回编译时错误。

节选:

test.cpp: In function 'int main(int, char**)':
test.cpp:10:13: error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'std::variant<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >')
   std::cout << a << b << std::endl;
   ~~~~~~~~~~^~~~

看似一个std::variant<int, std::string>无法流式传输。我怎样才能实现我可以直接将变体流式传输到输出流?

预期输出:

1hi

最佳答案

这也会流式传输嵌套变体。

template<class T>
struct streamer {
    const T& val;
};
template<class T> streamer(T) -> streamer<T>;

template<class T>
std::ostream& operator<<(std::ostream& os, streamer<T> s) {
    os << s.val;
    return os;
}

template<class... Ts>
std::ostream& operator<<(std::ostream& os, streamer<std::variant<Ts...>> sv) {
   std::visit([&os](const auto& v) { os << streamer{v}; }, sv.val);
   return os;
}

用作:

std::cout << streamer{a} << streamer{b} << '\n';

关于c++ - 如何流式传输 std::variant<...,...>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47168477/

相关文章:

c++ - 尝试访问 it 属性时前向声明 'const class LHContactInfo' 错误

c++ - C++ 中循环的替代方案

c++ - 如何从 leetcode 中获取 main 函数?

c++ - Cuda C++ 中的简单文件 I/O

Delphi:TFileStream 读/写进度(不浪费性能)

c - 应用程序在不同机器上的行为不同

c++ - 连接两个流函数 c++

c++ - 折叠表达式是 C++14 还是 C++1z 特性?

c++ - 返回 std::tuple 并 move 语义/复制省略

c++ - 使用/std :c++latest (or C++17/N4190) 使用 MSVC2015 编译 boost