2015-03-05 11 views
5

Ecco l'idioma in questione:Come chiamare l'idioma di utilizzare un array per applicare una funzione ad un pacchetto di variadic

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

Questo sarà compilato come g(t0); g(t1); ..., ordine delle chiamate di funzione è garantita da C + 11 [dcl.init.list]/4.
Una versione migliore utilizza std::initializer_list invece di matrice, ma qui non è importante.

La domanda è: come dovremmo chiamare questo idioma?

Upd:
In sostanza, è il linguaggio che dovremmo consigliare alle persone di usare al posto di ricorsione, ovvero di sostituire due overload
void f() {}
void f(H head, T... tail) { g(head); f(tail...); }
con singolo
void f(T... t) { int temp[]{(g(t), 0)...}; }

Ovviamente possiamo chiamarlo "Un idioma che sarà sostituito dal Fold Expressions" ma spero che ci sia un termine appropriato per esso.

+0

Btw, in C++ 1z questo probabilmente sarà sostituito da [Fold Expressions] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html) – Abyx

+0

"pack expansion" sembra coprirlo, sì? –

+0

@ Cheersandhth.-Alf, grazie, risolto. No, non è solo una "espansione del pacchetto": l'utilizzo dell'array gioca un ruolo chiave qui. È una cosa tipo "questo idion contro la ricorsione" – Abyx

risposta

1

Espansione confezione.

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

Un cattura seguita da puntini è un pacchetto di espansione (14.5.3). [Esempio:

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

-end esempio]

Penso che la ricopre. L'espansione del pacchetto senza applicare una funzione può essere vista come un'applicazione che applica una funzione di identità.

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

Un'espansione pacchetto costituito da un reticolo e puntini di sospensione, l'istanza di che produce zero o più istanze del modello in un elenco (descritto di seguito). [& hellip;]

+0

no, non si tratta di espansione del pacchetto. È come se l'idioma (in) famoso '0 == x' non riguardi' operator == '. Riguarda il modo in cui si sostituisce lo spacchettamento ricorsivo con l'espansione del pacchetto all'interno di un inizializzatore rinforzato. – Abyx

+0

Che ne dici, "* usando * espansione del pacchetto" allora? –

+0

no-no, guarda - con approccio ricorsivo abbiamo anche espansione del pacchetto - 'void f (H h, T ... t) {g (h); f (t ...); } ' – Abyx

0

Forse "richiamo di funzione esteso attraverso il pacchetto di parametri"?

+1

beh credo che dovrebbe avere "array" nel suo nome, perché ad es. usando una funzione di supporto 'template void eat (T ...) {}' e quindi 'eat (g (t) ...);' è anche una "chiamata di funzione espansa attraverso parameter pack" ma non lo fa la cosa - l'ordine delle chiamate non è garantito. – Abyx

0

Distinguiamo piegatura e mappatura. piega le serie di dati di input in un singolo valore. mappa trasforma serie di ingressi in serie di uscite. (Naturalmente, la mappatura può essere espressa come serie di scalari pieghevoli in una singola lista).

Qui mappiamo tutti gli ingressi a un valore nullo. Se evidenziamo gli effetti collaterali di g (x0), g (x1), ecc., Possiamo parlare di mappatura. Se evidenziamo la produzione di vuoto, - possiamo parlare di pura piegatura. Ma questo non ha senso, penso.

std :: transform is mapping. std :: accumulate è pieghevole. Cosa è std :: for_each? Mappatura o piegatura? (A proposito, è pieghevole, perché restituisce un oggetto funzione stateful con stato accumulato). Per quanto riguarda la funzione di input è unaria, non binaria, è mappatura (fusa con piegatura).

Così. Mi piacerebbe dare questo idioma "variadic for-each".

Problemi correlati