Holen Sie Teil von std::tuple
Ich habe ein Tupel der unbekannten Größe (es ist die Vorlage parametr der Methode)
Ist es Weg zu bekommen, ein Teil davon (ich brauche wegwerfen erste element)
Ich habe zum Beispiel tuple<int,int,int>(7,12,42)
. Ich will tuple<int,int>(12,42)
hier
- Sie haben wahre variadic template-Unterstützung (
template<class... Args>
)? Auch, Sie wollen kopieren Sie die Werte, oder wollen Sie einen Blick darauf, wie Verweise auf das original? - Ich möchte, Verweise besser, aber es ist nicht wirklich wichtig.
- Ich glaube nicht, verwenden variadic-Vorlagen jetzt. Aber ich benutze c++0x-g++4.6 und ich denke, Sie werden unterstützt.
- Ja, Sie sind. gcc.gnu.org/projects/cxx0x.html Oder wenn Sie wollen mehr C++11 feature bekommen, gcc 4.7, es ist Recht stabil jetzt
- Ich werde nicht verwenden Sie es jetzt, ich habe gerade Antwort Xeo ' s Kommentar..
- 'twas nur als einen Hinweis. Lesen Sie Ihre post, und sah den Kommentar 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Hilfe eines compile-time-integer-Liste:
Konnten wir konstruieren den Schwanz einfach durch den parameter-pack expansion:
Verwendung:
(Auf ideone: http://ideone.com/Tzv7v; der code funktioniert in g++ 4.5 bis 4.7 und clang++ 3.0)
std::index_sequence
stattct_integers_list
im C++14.Möglicherweise gibt es einen einfacheren Weg, aber das ist ein Anfang. Die "tail" - Funktion template gibt ein Tupel kopiert alle Werte des Originals mit Ausnahme des ersten. Dies kompiliert mit GCC 4.6.2 in C++0x-Modus.
template<size_t N, typename Tuple_Type> struct tuple_trunc {};
wird nie instanziiert, es kann geschrieben werden als:template<size_t N, typename Tuple_Type> struct tuple_trunc;
führen zu compiler-Fehler, wenn jemand aus versehen machen diese.Mit C++17, die Sie verwenden können,
std::apply
:Machte ich einige änderungen an Adam ' s code, dass würde Streifen aus den ersten N Argumente der Tupel, sowie erstellen Sie ein neues Tupel mit nur die letzten N-Arten ... Hier ist der vollständige code (Hinweis: wenn jemand beschließt, +1 meine Antwort, bitte auch +1 Adams Antwort, da das ist, was dieser code basiert auf, und ich will nicht zu nehmen einen Kredit Weg von seinem Beitrag):
Einen Tupel Scheibe Betrieb (das funktioniert auch für
std::array
undstd::pair
) definiert werden können, wie dies (C++14 notwendig):Und einer beliebigen Teilmenge der Tupel
t
erhalten werden kann, zum Beispiel so :Wo
[I1, I2)
ist die exklusive Auswahl der Teilmenge und der Rückgabewert ist ein Tupel entweder Referenzen oder Werte, je nachdem, ob die Eingabe ein Tupel ist ein lvalue oder ein rvalue jeweils (eine Gründliche Ausarbeitung finden Sie in meinem blog).Bitte nicht verwenden!
int
aber kann fehlschlagen, für Ihre Art!).Siehe Anmerkungen zur Diskussion. Ich lasse diese Antwort ist nur für Referenz.
Sogar noch einfacher:
Bekam ich:
Ich bin nicht sicher, dass dies nicht eine unbestimmte Verhalten. Für mich funktioniert: Fedora 20 und
Referenzen: Artikel auf voidnish.wordpress.com/.
gcc
undclang
(Versionen bereitgestellt in Antwort). Allerdings würde ich nicht empfehlen, es zu tun auf diese Weise.tuple
kopieren, binary order wird nicht angegebentuple
imstd
, also Nein, das ist nicht tragbar. Es sei denn, es ist angegeben, YMMV, und kann zu unerwarteten Fehlern. Ich würde versuchen, und legte in einigenstatic_assert
s um sicherzustellen, dass Sie Ihren compiler nicht zu, es Durcheinander, und/oder eine Funktion ein-und Ausschluss-Mechanismen zu wechseln, um die Arbeiterklasse ein. Es könnte auch eine Polsterung Problemen, wenn Sie verschiedene Arten in Ihre Tupel, obwohl ich nicht sicher bin.