2016-05-03 8 views
-1

Mein Problem ist std :: tuple hat keine Memberfunktion wieWie für eine std :: tuple

auto t = std::make_tuple(1,2,"foo"); 
t.get(1); 

eine get() Member-Funktion erstellen, wie kann ich eine solche Funktion implementieren, wenn ich eine Wrapper-Klasse erstellen arround std :: tuple

+3

Warum können Sie nicht einfach 'std :: get <1> (t)' verwenden? –

Antwort

0

Um einen Wert aus einem Tupel erhalten Sie std::get<0>(tuple)

Sie keine get Funktion haben kann, wie Sie wollen, da Tupelelemente nicht notwendigerweise vom gleichen Typ (in Ihrem Beispiel verwenden sollten Sie haben Ints und eine Zeichenfolge). Was wäre der Rückgabetyp dieser get Funktion?

Sie können eine Vorlage get Funktion hinzufügen, so dass derived_tuple.get<0>() das erste Element zurückgibt.

3

Eine solche Funktion kann (in aktuellen C++ - Standards) nicht existieren, da Funktionsargumente ein Laufzeitmechanismus sind, aber Rückgabetypen zur Kompilierungszeit bekannt sein müssen. Letzteres kann also nicht von ersterem abhängen.

Verwenden std::get statt:

auto v = std::get<1>(someTuple); 
+0

Während es tatsächlich wahr ist, habe ich mich immer gewundert, warum 'get' als freie Funktion und nicht als Tupelgliedfunktion implementiert wird. Hast du eine Ahnung warum? – SergeyA

+4

@SergeyA Also in Vorlagen müssen Sie nicht schreiben 'foo.template get <0>()'. –

+0

@ T.C., Wahr. Ich habe es gefunden und sogar als separate Antwort gepostet. Wollte meine Frage stellen, als vergessen :) – SergeyA

0

Es gibt hier eigentlich zwei Fragen. Die erste ist

warum Get hat eine Vorlage Integral-Argument, anstatt eine Annahme dieser Wert als Funktion Argument.

Dies wurde beantwortet.

Die andere Frage ist

warum erhalten Sie eine kostenlose Funktion ist eher als eine Memberfunktion

Um dies die Antwort scheint zu sein - so dass auf Templat-Typen genannt, wäre es nicht erforderlich Verwendung des Schlüsselwortes typename. Beispiel. Nehmen wir an, Tupel eine get als Mitglied hätte, hätte es wie in unten Code aufgerufen werden:

template <class T> void foo(T tuple) { 
    tuple.template get<1>() = 42; 
} 

Diese template ist sicherlich ein Ärgernis.

Verwandte Themen