2015-03-05 14 views
5

Oto idiom w pytaniu:Jak wywołać idiom za pomocą tablicy, aby zastosować funkcję do zmiennej liczbie argumentów opakowanie

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

ta zostanie skompilowany jako g(t0); g(t1); ..., kolejność wywołań funkcji jest gwarantowana przez C + +11 [dcl.init.list]/4.
Lepsza wersja używa std::initializer_list zamiast tablicy, ale tutaj nie ma to znaczenia.

Pytanie brzmi: jak nazwać ten idiom?

Upd:
Zasadniczo, jest to idiom, który powinniśmy doradzać ludziom, aby używać go zamiast rekurencji, czyli zastąpienie dwóch przeciążeń
void f() {}
void f(H head, T... tail) { g(head); f(tail...); }
z pojedynczym
void f(T... t) { int temp[]{(g(t), 0)...}; }

Oczywiście możemy to nazwać "idiomem, który zostanie zastąpiony przez Fold Expressions", ale mam nadzieję, że istnieje odpowiedni termin dla to.

+0

okazji, C++ 1Z ten prawdopodobnie zostanie zastąpiony [Fold wyrażeń] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html) – Abyx

+0

"ekspansja pakietu" wydaje się to pokrywać, tak? –

+0

@ Cheersandhth.-Alf, dzięki, naprawione. Nie, to nie jest tylko "rozszerzenie paczki" - używanie tej tablicy odgrywa tu kluczową rolę. Jest to rodzaj "idiona kontra rekursja", rzecz. – Abyx

Odpowiedz

1

Ekspansja pakietu.

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

wychwytywania następnie przez elipsy jest Dodatek (14.5.3). [przykład:

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

końcem przykład]

ja że obejmuje go. Rozszerzenie paczki bez zastosowania funkcji może być postrzegane jako zastosowanie funkcji tożsamości.

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

ekspansji pakietu składa się wzór i elipsy, której instancji wytwarza zero lub więcej wystąpień wzorca na liście (opisane poniżej). [& hellip;]

+0

nie, nie chodzi o rozszerzenie paczki. To tak, jak w słynnym idiomie "0 == x" nie chodzi o 'operator =='. Chodzi o to, jak zastąpić rozpakowywanie rekursywne z rozszerzaniem paczek w inicjalizatorze ze stężeniem. – Abyx

+0

Co powiesz na "* używanie * rozszerzenia paczki"? –

+0

no-no, look - z rekursywnym podejściem mamy również rozszerzenie paczki - 'void f (H h, T ... t) {g (h); f (t ...); } ' – Abyx

0

Być może "wywołanie funkcji rozszerzonej w pakiecie parametrów"?

+1

cóż, wierzę, że powinien mieć w nazwie "tablicę", ponieważ np. przy użyciu funkcji pomocnika 'szablon void eat (T ...) {}', a następnie 'eat (g (t) ...);' także jest "wywołanie funkcji rozwinięte w pakiecie parametrów", ale nie robi rzecz - kolejność połączeń nie jest gwarantowana. – Abyx

0

Rozróżnij fałdowanie i mapowanie. zwiń zmienia serię danych wejściowych w jedną wartość. mapa zamienia serie wejść do serii wyjść. (Oczywiście, mapowanie może być wyrażone jako składanie serii skalarów do pojedynczej listy).

Tutaj mapujemy wszystkie wejścia na wartość nullary. Jeśli podświetlimy efekty uboczne g (x0), g (x1), itp. - możemy mówić o mapowaniu. Jeśli podkreślimy produkcję pustki, możemy mówić o czystym składaniu. Ale myślę, że to bez znaczenia.

transformacja std :: mapowanie. std :: accumulate to składanie. Co to jest std :: for_each? Mapowanie lub składanie? (BTW, zwijanie, ponieważ zwraca stanowy obiekt funkcji ze stanem zakumulowanym). O ile funkcja wejściowa jest unarna, a nie binarna, to odwzorowanie (połączone ze składaniem).

So. Chciałbym nadać temu idiomowi "variadic for-each".

Powiązane problemy