2015-03-05 8 views
5

hier anwenden:Wie das Idiom nennen eine Reihe von mit einer Funktion zu einem variadische Pack ist das Idiom in Frage

template<typename... T> 
void f(T... t) { 
    int temp[] = {(g(t), 0)...}; 
} 

Dies als g(t0); g(t1); ... kompiliert werden, Anrufe Reihenfolge der Funktion von C + garantiert +11 [dcl.init.list]/4.
Eine bessere Version verwendet std::initializer_list anstelle von Array, aber es ist nicht wichtig hier.

Die Frage ist: wie sollen wir dieses Idiom nennen?

Upd:
Im Grunde ist es die Sprache, die wir es den Leuten verwenden anstelle von Rekursion raten sollte, dh zwei Überlastungen
void f() {}
void f(H head, T... tail) { g(head); f(tail...); }
mit Einzel
void f(T... t) { int temp[]{(g(t), 0)...}; }

zu ersetzen

Natürlich können wir es "Ein Idiom, das durch die Fold Expressions ersetzt wird" nennen, aber ich hoffe, dass es einen richtigen Ausdruck dafür gibt es.

+0

Btw, in C++ 1z wird dies wahrscheinlich ersetzt durch [Falten Ausdrücke] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html) – Abyx

+0

"pack expansion" scheint es zu bedecken, ja? –

+0

@ Cheersandthth.-Alf, danke, behoben. Nein, es ist nicht nur eine "Pack-Erweiterung" - die Verwendung des Arrays spielt hier eine Schlüsselrolle. Es ist ein bisschen "diese Idion vs Rekursion" Ding – Abyx

Antwort

1

Packerweiterung.

C++ 11 §5.1.2/23 in [expr.prim.lambda]:

A capture mit drei Punkten ist eine Packung Erweiterung (14.5.3). [Beispiel:

template<class... Args> 
void f(Args... args) { 
    auto lm = [&, args...] { return g(args...); }; 
    lm(); 
} 

-Ende Beispiel]

Ich denke, dass es abdeckt. Die Packexpansion ohne Anwendung einer Funktion kann als eine Anwendung einer Identitätsfunktion angesehen werden.

C++ 11 §14.5.3/4 in [temp.variadic]:

A Erweiterungspaket ein Muster besteht und ein Auslassungszeichen, die Instanziierung von denen null oder mehr produziert Instanziierungen des Musters in einer Liste (unten beschrieben). [& hellip;]

+0

Nein, es geht nicht um Pack-Erweiterung. Es ist, als ob das (in) berühmte '0 == x' Idiom nicht über' operator == 'ist. Es geht darum, wie Sie das rekursive Entpacken durch Pack-Erweiterung in einem braced-initializer ersetzen. – Abyx

+0

Wie wäre es, "* mit * Pack-Erweiterung" dann? –

+0

no-no, schauen Sie - mit rekursiven Ansatz haben wir auch Pack-Erweiterung - "void f (H h, T ... t) {g (h); f (t ...); } ' – Abyx

0

Vielleicht "Funktionsaufruf über Parameter-Pack erweitert"?

+1

und ich glaube, dass es "Array" in seinem Namen haben sollte, weil z.B. mit Hilfe einer Hilfsfunktion 'template void essen (T ...) {}' und dann 'essen (g (t) ...);' ist auch ein "Funktionsaufruf über Parameterpack erweitert", aber es nicht Die Sache - Reihenfolge der Anrufe ist nicht garantiert. – Abyx

0

Lassen Sie uns Falten und Mapping unterscheiden. falten verwandelt die Reihe der Eingabedaten in einen einzigen Wert. Karte schaltet Reihe von Eingängen auf Reihe von Ausgängen um. (Natürlich kann das Mapping als faltende Reihe von Skalaren zu einer einzigen Liste ausgedrückt werden).

Hier ordnen wir alle Eingaben einem Nullwert zu. Wenn wir die Nebenwirkungen von g (x0), g (x1) usw. hervorheben, können wir über das Mapping sprechen. Wenn wir die Erzeugung von Leerstellen hervorheben, können wir über reine Faltung sprechen. Aber das ist bedeutungslos, denke ich.

Std :: Transformation ist Mapping. std :: accumulate faltet. Was ist std :: for_each? Mapping oder Falten? (BTW, es faltet, weil es ein statusbehaftetes Funktionsobjekt mit akkumuliertem Zustand zurückgibt). Soweit die Eingabefunktion unär ist, nicht binär, ist es Mapping (fusioniert mit Faltung).

So. Ich möchte dieses Idiom "variadic for-each" geben.