nicht sicher, dass es eine gute Idee, aber ich nehme an, Sie ein operator<<()
für std::variant
definieren könnten.
Just for fun ich die eine realisiert haben Sie im folgenden Beispiel sehen kann (ich nehme an kann ein wenig vereinfacht werden)
#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;
}
- EDIT -
Eine weitere Möglichkeit, schreiben die streamV()
Helferfunktion, ohne die T0, Ts...
Typen aber mit std::variant_size_v
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); }
- EDIT 2 -
Wie T.C. (Danke!) Ich habe nur (mit streamV()
) eine weniger effiziente, weniger interessante und weniger sinnvolle Version von std::visit()
implementiert.
Mit std::visit()
meinem Beispiel viel einfacher
#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;
}
werden könnte ich wiederhole: nur zum Spaß, weil ich nicht glaube, es ist eine gute Idee operator<<()
über einen Standard-Typ definieren.
Ich schlage die Lösung von T.C. die die Varianteninstanz umhüllen, um in einer bestimmten Klasse zu streamen.
Etwas in dieser Richtung: 'std :: Besuch ([] (const auto & v) {std :: cout << v;} a);' –
Boost.Variant unterstützt einen Insertion Operator, mir ist nicht klar, warum dies in 'std :: variant' weggelassen wurde. http://www.boost.org/doc/libs/1_65_1/doc/html/boost/operator_idp789915280.html – GManNickG