std::vector
はランタイムビーストです。つまり、ヒープにバッファを割り当て、実行時には通常どんな操作も許可されます。一方、バリデーションテンプレート "pealing"はコンパイル時に行われます。その結果、std::vector
とバリデーショナルテンプレートはやや「ばらばらに」なっています。したがって、ベクトルで望むことをすることはできません。
あなたはベクトルの要素を合計したい場合は、これはstd::accumulate
を使用して、実行時に行うことができます。
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = std::accumulate(v.begin(), v.end(), 0);
ブライアンはあなたがとの組み合わせで、コンパイル時の計算にstd::array
を使用することができ、コメントで述べたようにconstexpr
機能。あなたがこれを行うことができる方法の例を以下に表示されます。上記の例で
namespace detail {
template <class T1, class T2>
constexpr auto sum_(T1 a, T2 b) {
return a + b;
}
template <class T1, class T2, class... T3>
constexpr auto sum_(T1 a, T2 b, T3... tail) {
return a + sum_(b, tail...);
}
template <typename T, std::size_t N, std::size_t... Is>
constexpr T sum_impl(std::array<T, N> const &src, std::index_sequence<Is...>) {
return sum_(src[Is]...);
}
}
template <typename T, std::size_t N>
constexpr T sum(std::array<T, N> const &arr) {
return detail::sum_impl(arr, std::make_index_sequence<N>{});
}
Live Demo
私はあなたのsum
機能constexpr
をマーク。 std::make_index_sequence
を使用して、配列の要素をvariadicのsum
関数の引数としてどのように使うことができるかを理解することもできます。
バリアント関数はコンパイル時に解決され、ベクトルは実行時に決定されるサイズを持ちます。おそらく、あなたはベクトル引数を専門にするべきでしょう。 – jaggedSpire
コンパイル時にサイズが分かっているstd :: arrayも使用できます。 – Brian
@ClaudiuちょうどFYI:あなたのリンクはここにポイントします。 ;-) – jaggedSpire