Forum: PC-Programmierung std::variant mit std::tuple initialisieren?


von cppbert (Gast)


Lesenswert?

ich möchte ein std::variant mit einem std::tuple initialisieren so das 
die Typen in dem Tuple Values im variant werden - ist das eine Art 
unpacking?

C++17
1
#include <variant>
2
#include <tuple>
3
#include <type_traits>
4
5
using V0 = std::variant<int, float, char>;
6
using V1 = std::variant<int, float, char>;
7
using T = std::tuple<int,float,char>;
8
using V2 = std::variant<T>;
9
10
static_assert(std::is_same<V0, V1>::value, "not the same"); // logischerweise OK
11
static_assert(std::is_same<V0, V2>::value, "not the same"); // ist ja auch nicht <int,float,char> sondern T

ich möchte das V2 is_same is zu V0 und V1 - geht das irgendwie?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

So?
1
#include <variant>
2
#include <tuple>
3
#include <type_traits>
4
5
template <typename T>
6
struct GetVariantI;
7
8
template <typename... T>
9
struct GetVariantI<std::tuple<T...>> {
10
    using type = std::variant<T...>;
11
};
12
13
template <typename T>
14
using GetVariant = typename GetVariantI<T>::type;
15
16
17
using V0 = std::variant<int, float, char>;
18
using V1 = std::variant<int, float, char>;
19
using T = std::tuple<int,float,char>;
20
using V2 = GetVariant<T>;
21
22
static_assert(std::is_same<V0, V1>::value, "not the same"); // logischerweise OK
23
static_assert(std::is_same<V0, V2>::value, "not the same"); // ist ja auch nicht <int,float,char> sondern T

von mh (Gast)


Lesenswert?

Niklas G. schrieb:
> So?

Ich weiß nicht, ob es dem TO hilft, aber mir hilft es. Ich habe eben 
versucht es über template template parameter zu lösen und bin damit 
gescheitert. Dabei habe ich mal wieder festgestellt, dass sie nie 
helfen, wenn ich sie für die logische Wahl halte.

von cppbert (Gast)


Lesenswert?

Ja genau so, Niklas G. - wie immer sehr schnell am Start :)

ich dachte mich schon das man es so machen muss - aber hätte mich jetzt 
auch nicht gewundert wenn es einen noch viel kürzeren Weg gibt

Danke

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

mh schrieb:
> Dabei habe ich mal wieder festgestellt, dass sie nie
> helfen, wenn ich sie für die logische Wahl halte.

IMO braucht man die eh nicht, und es gibt bessere Alternativen welche 
zwar etwas länger, dafür aber flexibler und weniger hirnverdrehend sind.

cppbert schrieb:
> Ja genau so, Niklas G. - wie immer sehr schnell am Start :)

Gern ;-)

von cppbert (Gast)


Lesenswert?

hab jetzt echt 1sek nach deinem Post ein Stackoverflow Post gefunden: 
https://stackoverflow.com/questions/47599774/convert-tuple-to-variant

entspricht deiner Lösung

von mh (Gast)


Lesenswert?

Niklas G. schrieb:
> IMO braucht man die eh nicht, und es gibt bessere Alternativen welche
> zwar etwas länger, dafür aber flexibler und weniger hirnverdrehend sind.

Ich hoffe trotzdem hin und wieder, dass es eine gut Anwendung dafür 
gibt.

Meine Variante
1
template <template <typename ...Args> typename>
2
struct GetVariantI {
3
    using type = std::variant<Args...>;
4
};
wäre immerhin zwei ganze Zeile kürzer als deine! Wäre es nicht toll, 
wenn das so funktionieren würde? Ok es ist schlechter lesbar und bietet 
auch sonst keinen wirklichen Vorteil ...

von Niklas Gürtler (Gast)


Lesenswert?

mh schrieb:
> Meine Variante

Das ist aber ziemlich genau das Gegenteil von dem, was 
template-templates können!

Das wäre anzuwenden, wenn die Parameter schon "bekannt" sind, aber das 
"variant" an sich variabel wäre. Also "Get<std::variant, int, float, 
char>" zu "std::variant<int, float, char>"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.