2017-02-21 4 views
1

Ich habe eine Frage, wie das folgende Verhalten zu erreichen, oder wenn es sogar in C++ möglich ist. Sagen wir, ichArray Elemente zu Variadic Template Argumente

template<typename T, typename...Pack> 
T sum(T a, Pack... pack) { 
    return a + sum(pack...); 
} 

template<typename T> 
T sum(T a) { 
    return a; 
} 

und dann Ich habe ein Array

double array[5]; 

ist es eine Möglichkeit, ich könnte gehen über das Tun etwas wie

sum(array[0], array[1], array[2], array[3], array[4]); 

ohne harte Kodierung in jedem Element dieses variadische Funktion haben ausdrücklich? Der Grund, ich versuche, etwas wie zu implementieren, wie

double array[N]; 
sum(array[0], array[1], array[2], ..., array[N-1]); 

wo N zur Kompilierzeit festgelegt ist.

Antwort

5

Sie können mit Hilfe des Index-Sequenz Tricks:

template <class T, size_t N, size_t... Is> 
T array_sum_impl(T (&arr)[N], std::index_sequence<Is...>) { 
    return sum(arr[Is]...); 
} 

template <class T, size_t N> 
T array_sum(T (&arr)[N]) { 
    return array_sum_impl(arr, std::make_index_sequence<N>{}); 
} 

Aber es ist wahrscheinlich besser zu tun, nur das normal:

auto sum = std::accumulate(std::begin(array), std::end(array), 0.0); 
+0

Ich verstehe ist, erweitert (wie I ...), aber habe noch nie etwas wie arr [Is] ... gesehen. Das ist eine gültige Erweiterung? Außerdem versuche ich im Allgemeinen nicht, die Dinge zusammenzufassen, die Zusammenfassung war nur ein einfaches Beispiel, um mir zu zeigen, welche Schnittstelle ich erreichen möchte. – armstrhu

+0

@armstrhu Ja, Sie können beliebig komplizierte Ausdrücke erweitern, solange sie sich in einem Kontext befinden, in dem eine Erweiterung zulässig ist. 'arr [Is] ...' expandiert zu 'arr [Ist # 1], arr [Ist # 2], ..., arr [Ist # N]'. Siehe auch [meine Antwort hier] (http://stackoverflow.com/a/26767333/2069064) und [Nawaz ist hier] (http://stackoverflow.com/a/17652683/2069064) – Barry

Verwandte Themen