2016-06-23 9 views
3

私は2 std::arrayをとる単純な関数を作りました。別のstd::arrayを返し、std::arraysの値の平均値を返します。テンプレートを使ってベクトルの平均を計算する

template<typename T, std::size_t N> 
std::array<T, N> average(const std::array<T, N>& a1, const std::array<T, N>& a2) 
{ 
    std::array<T, N> array; 
    for (std::size_t i = 0; i < N; ++i) 
     array[i] = (a1[i] + a2[i])/2; 

    return array; 
} 

完全に動作します。今私はNベクトルの平均を計算したいと思います。誰かが私を助けてくださいすることができますので、私も働く。この

template<typename T, std::size_t N, typename... Ts> 
std::array<T, N> average(const Ts&... args) 
{ 
    std::array<T, N> result; 
    for (std::size_t i = 0; i < N; ++i) 
    { 
     T addedValues = 0; 
     for (const auto& array : { args... }) 
      addedValues += array[i]; 

     result[i] = addedValues/sizeof...(args); 
    } 

    return result; 
} 

を作ったが、私は

std::array<int, 3> a{ 1, 2, 3 }; 
std::array<int, 3> b{ 3, 4, 5 }; 

auto c = average<int, 3>(a, b); //'<int, 3>' not good, possible without? 

たテンプレート引数を指定する必要があり、私は、別の方法を考えることができませんでしたか?

+1

タイプ。 – lorro

+0

@lorro良い点は、行う:) – Rakete1111

答えて

5

テンプレート機能の本体で必要な変更を加えた場合でも、次のようにあなたのテンプレート関数のシグネチャを変更することができます:

template<typename T, std::size_t N, typename... Ts> 
std::array<T, N> average(std::array<T, N> const &arr, const Ts&... args) 

あなたがTNを推測だろう明示的にテンプレート引数とテンプレート引数控除を指定する必要はありませんので、あなたがaverageテンプレート関数を呼び出すことができます。この方法以下のように:私は、あなたがイテレータ(開始と終了)、またはレンジ/スパンを取るためにあなたがのstd ::配列<> ``に限定されていない、そのようにお勧めしたい、しかし、あなたはすべてのコンテナを使用することができます

std::array<int, 3> a{ 1, 2, 3 }; 
std::array<int, 3> b{ 3, 4, 5 }; 

auto c = average(a, b);