2017-02-21 9 views
1

次の動作を達成する方法、またはC++で可能であるかどうかについて質問があります。私はこの可変引数関数に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

私は(ようになっているようですが拡大して理解して... )、しかしarr [Is] ...のようなものは見たことがない。それは有効な拡張ですか?また、私は一般的に物事を合計しようとしていませんが、合算は私が達成しようとしているインターフェースを実証できるような単純な例に過ぎませんでした。 – armstrhu

+0

@armstrhuはい、拡張が許可されているコンテキストであれば、任意の複雑な式を展開できます。 'arr [Is] ...'は 'arr [Is#1]、arr [Is#2]、...、arr [Is#N]'に展開されます。 [私の答えはこちら](http://stackoverflow.com/a/26767333/2069064)と[Nawazのここ](http://stackoverflow.com/a/17652683/2069064)も参照してください。 – Barry

関連する問題