Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何流式传输std::variant<&燃气轮机;_C++_Stream_C++17_Variant - Fatal编程技术网

C++ 如何流式传输std::variant<&燃气轮机;

C++ 如何流式传输std::variant<&燃气轮机;,c++,stream,c++17,variant,C++,Stream,C++17,Variant,Mystd::variant包含可流式处理的类型: std::variant<int, std::string> a, b; a = 1; b = "hi"; std::cout << a << b << std::endl; 我认为您必须使用std中的get函数来获取可流化类型,而不是变量类型本身 诸如此类 std::cout << std::get<int>(a) << std::get<std::s

My
std::variant
包含可流式处理的类型:

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

我认为您必须使用std中的get函数来获取可流化类型,而不是变量类型本身

诸如此类

std::cout << std::get<int>(a) << std::get<std::string>(b) << std::endl;

std::cout不确定这是否是一个好主意,但我想您可以定义一个
操作符来流式处理嵌套的变体

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;
}
模板
结构拖缆{
常数T&val;
};
模板拖缆(T)->拖缆;
模板
std::ostream&operator注:以下示例摘自Igor Tandetnik对问题本身的评论

是标准库中的一个函数,可用于此确切目的:

#包括
#包括
int main(){
标准::变量值=42;

std::visit([](const auto&elem){std::cout在实际情况下,我会在容器类型中使用
std::variant
,因此我事先不知道该类型。你是对的,我的答案是错误的。我没有领会问题的真正含义。大致如下:
std::visit([](const auto&v){std::cout Boost.Variant支持插入运算符,我不清楚为什么在
std::Variant
中省略了它。让我们不要重新实现
std::visit
@T.C.-是的……我想我已经改头换面了:(有什么理由不在标准中吗?@ClaasBontus通常的答案是:没有提出这个问题。有人能澄清这句话吗:template streamer(t)->streamer;@LeDYoM它允许streamer类的模板参数推断,所以您不需要编写
streamer{a}
。请查看中的“用户定义扣减指南”部分。请注意,扣减指南在C++20中不是必需的,C++20隐式地为聚合类模板生成扣减指南。我不明白为什么人们没有对这个答案投赞成票。
std::cout << std::get<int>(a) << std::get<std::string>(b) << std::endl;
#include <variant>
#include <iostream>

template <std::size_t I, typename T0, typename ... Ts>
std::enable_if_t<(I == 1U+sizeof...(Ts)), std::ostream &>
   streamV (std::ostream & s, std::variant<T0, Ts...> const &)
 { return s; }

template <std::size_t I, typename T0, typename ... Ts>
std::enable_if_t<(I < 1U+sizeof...(Ts)), std::ostream &>
   streamV (std::ostream & s, std::variant<T0, Ts...> const & v)
 { return I == v.index() ? s << std::get<I>(v) : streamV<I+1U>(s, v); }

template <typename T0, typename ... Ts>
std::ostream & operator<< (std::ostream & s, 
                           std::variant<T0, Ts...> const & v)
 { return streamV<0U>(s, v); }

int main ()
 {
   std::variant<int, std::string> a, b;
   a = 1;
   b = "hi";
   std::cout << a << b << std::endl;
}
template <std::size_t I, typename V>
std::enable_if_t<(I == std::variant_size_v<V>), std::ostream &>
   streamV (std::ostream & s, V const &)
 { return s; }

template <std::size_t I, typename V>
std::enable_if_t<(I < std::variant_size_v<V>), std::ostream &>
   streamV (std::ostream & s, V const & v)
 { return I == v.index() ? s << std::get<I>(v) : streamV<I+1U>(s, v); }
#include <variant>
#include <iostream>

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

int main ()
 {
   std::variant<int, std::string> a, b;
   a = 1;
   b = "hi";
   std::cout << a << b << std::endl;
}
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';