std::variant mit std::tuple initialisieren?

Gast #6414514
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
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
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.
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.