2017-02-21 3 views
1

У меня вопрос о том, как выполнить следующее поведение, или если это возможно даже на C++. Скажем, у меня есть эта VARIADIC функцииЭлементы массива в аргументы шаблона Variadic

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

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

, а затем у меня есть массив

double array[5]; 

есть способ, которым я мог бы идти о делать что-то вроде

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

без жесткого кодирования в каждом элементе явно? Причина, я пытаюсь реализовать что-то такое, как,

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

где N установлен во время компиляции.

ответ

5

Вы можете, с помощью последовательности индекса трюк:

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>{}); 
} 

Но это, наверное, лучше просто сделать нормальный:

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

Я понимаю, расширение Is (например, Is ...), но не видели что-то вроде arr [Is] ... раньше. Это допустимое расширение? Кроме того, я вообще не пытаюсь суммировать вещи, суммирование было всего лишь простым примером, чтобы позволить мне продемонстрировать интерфейс, который я пытаюсь достичь. – armstrhu

+0

@armstrhu Да, вы можете расширить произвольно сложные выражения, если они находятся в контексте, где допускается расширение. 'arr [Is] ...' расширяется до 'arr [Is # 1], arr [Is # 2], ..., arr [Is # N]'. См. Также [мой ответ здесь] (http://stackoverflow.com/a/26767333/2069064) и [Наваз здесь] (http://stackoverflow.com/a/17652683/2069064) – Barry

Смежные вопросы