2016-04-28 8 views
2
template<std::size_t... Is> 
void unlock_(std::index_sequence<Is...>) { 

    iter(std::get<Is>(tuple)...); 
} 

Betrachten wir das obige Beispiel. Ich kann iter(std::get<Is>(tuple)...); nicht verstehen. Ich weiß, dass ... "Operator" erweitert. Daher sollte es auf Parameterpacks (in Sense-Argumenten) oder Template-Paramenter-Packs angewendet werden. Und ich kann mir vorstellen, was std::index_sequence<Is...> ist. Da Is Template-Parameterpaket ist, sollte es nur 1, 2, 3, 4, ... (zum Beispiel) sein. In diesem Fall ist der out-Parameter spezifisch, weil er kein Typ ist. Es ist size_t.TMP C++ und Parameterpakete

Aber hier: std::get<Is>(tuple)...);std::get<Is>(tuple) gibt Parameter/Template Pack nicht zurück, so kann ich nicht den Kontext der Verwendung.

P.S. Ist es möglich zu sehen, wie der Code nach Meta-Programmierung aussieht? Ähnlich wie nach der Vorverarbeitung?

Vielen Dank im Voraus.

+3

Der gesamte Ausdruck, der die Paketvariable enthält, wird erweitert, so erhalten Sie 'std :: get <1> (Tupel), std :: get <2> (Tupel)', .... –

+1

Die [Pack-Erweiterung] (http://de.cppreference.com/w/cpp/language/parameter_pack) Abschnitt der [cppreference Seite für Parameter Packs] (http://en.cppreference.com/w/cpp/language/parameter_pack) erklärt, wie dies funktioniert. – Andrew

+1

Die Erweiterung des Parameterpakets ist ziemlich komplex und erweitert den gesamten Ausdruck und nicht das Argument. – SergeyA

Antwort

2

Dies ist eine Methode zum Erweitern eines std::tuple durch Generieren einer Kompilierungssequenz von Indizes.

... erweitert in diesem Kontext Formulare, die nicht erweiterte Parameterpakete enthalten. Es wird eine Liste wie folgt erzeugen:

Is... 
0,1,2,... 

doSomething(Is)... 
doSomething(0), doSomething(1), doSomething(2), ... 

doSomething(Is...) 
doSomething(0,1,2,...) 

std::get<Is>(tuple)... 
std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), ... 

iter(std::get<Is>(tuple)...) 
iter(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), ...) 

Der Effekt ist, dass iter mit Argumenten aus dem Tupel extrahiert aufgerufen wird.

Verwandte Themen