2016-06-23 4 views
3

나는 2 std::array을 취하고 std::arrays에있는 값의 평균값을 가지고 또 다른 std::array을 반환하는 간단한 함수를 만들었습니다.템플릿을 사용하여 벡터의 평균 계산하기

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 벡터의 평균을 계산하고 싶습니다. 그래서

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? 

나는 다른 방법을 생각하지 못했습니다, 누군가가 제발 도움이 될 수 있습니다 나는 또한 작동이

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

을했다,하지만 난 결과 템플릿 인수를 지정해야?

+1

반복자 (시작과 끝) 또는 범위/span을 사용하면'std :: array <> '에 국한되지 않고 모든 컨테이너를 사용할 수 있습니다. 유형. – 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 템플릿 함수를 호출 할 수있는이 방법 as :

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

auto c = average(a, b); 
관련 문제