std::variant mit std::tuple initialisieren?

Gast #6414514
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?
Persönliche Seite #6414532
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
Gast #6414554
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
Gast #6414568
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 ...
Gast #6414611
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>"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren