In C ++ können Sie haben eine Funktion, die ein Tupel von variabler Länge modifiziert?

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

Frage

In C ++ 0x würde Ich mag eine Funktion wie folgt schreiben:

template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
    //Put things into the tuple
}

Ich versuchte zunächst, ein auf int i for-Schleife zu verwenden und dann tun:

get<i>(my_tuple);

Und dann speichern Sie einen Wert im Ergebnis. Allerdings get funktioniert nur auf constexpr.

Wenn ich die Variablen aus dem tuple bekommen konnte und sie zu einer variadische Templat-Funktion übergebe ich durch die Argumente sehr leicht Rekursion konnte, aber ich habe keine Ahnung, wie die Variablen ohne get aus dem Tupel zu erhalten. Alle Ideen, wie das zu tun? Oder hat jemand eine andere Möglichkeit, diese tuple modifizieren?

War es hilfreich?

Lösung

Da die "i" in

get<i>(tup)

muss eine Kompilierung-Konstante sein, Vorlage Instanziierung verwendet wird, um „iterate“ (eigentlich recurse) durch die Werte. Boost-Tupel hat die „Länge“ und „Element“ Meta-Funktionen, die hier hilfreich sein können - Ich gehe davon aus C ++ 0x auch diese hat

.

Andere Tipps

Boost.Fusion ist einen Blick wert. Es kann ‚Iterierte‘ über std::pair, boost::tuple, einige andere Container und ihre eigenen Tupel-Typen, obwohl ich glaube nicht, es unterstützt std::tuple noch.

AFAICT, C ++ Tupel müssen grundsätzlich mit Rekursion behandelt werden; da sich keine wirklichen Möglichkeiten der Verpackung zu sein scheint / Entpacken Tupeln außer die Typisierung einzigen variadische Vorlage Umgang mit.

Werfen Sie einen Blick auf Abschnitt 6.1.3.4 von TR1, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

get wird für beide const und nicht-const qualifizierten Tupel und gibt den entsprechenden Referenztyp definiert. Wenn Sie Ihre Funktionsdeklaration wie folgt ändern:

template 
void fun(typename std::tuple& my_tuple) {
    //Put things into the tuple
}

Dann wird das Argument auf Ihre Funktion ist ein nicht-const Tupel und erhält ermöglicht es Ihnen, die notwendigen Aufgaben zu machen, wenn Sie die Iteration geschrieben haben, die Informationen in früheren Antworten zur Verfügung gestellt werden.

Haben Sie einen Blick auf meine Antwort hier für ein Beispiel-Vorlage Rekursion Tupel Argumente für einen Funktionsaufruf zu entspannen.

Wie erweitere ich Tupels in variadische Argumente der Template-Funktion?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top