2015-05-20 116 views
2

只需使用此簡單片段即可從容器中計算總和和平均值,即可使用多個返回值進行試驗。從迭代器中扣除值類型以返回模板函數的類型

template<typename Iter> 
std::tuple<double, double> summean(Iter first1, Iter last1) 
{ 
    double sum = std::accumulate(first1, last1, 0.0); 
    double mean = sum/(last1-first1); 

    return {sum, mean}; 
} 

該演示程序僅使用雙精度計算作爲演示。有沒有一種優雅的方式來使用元組的返回類型的計算中的值的精度?

回答

4

您可以使用std::iterator_traits::value_type

typedef typename std::iterator_traits<Iter>::value_type value_type; 

至於函數聲明和定義,在老派C++ 03的風格,你可以做到以下幾點:

template<typename Iter> 
std::pair<typename std::iterator_traits<Iter>::value_type, 
      typename std::iterator_traits<Iter>::value_type> 
summean(Iter first1, Iter last1) 
{ 
    typedef typename std::iterator_traits<Iter>::value_type value_type; 
    value_type sum = std::accumulate(first1, last1, value_type()); 
    value_type mean = sum/(last1-first1); 

    return std::make_pair(sum, mean); 
} 

而且,由於C + +11您可以使用decltype和追蹤返回類型使其不那麼冗長:

template<typename Iter> 
auto summean(Iter first1, Iter last1)->decltype(std::make_tuple(*first1, *first)) 
{ 
    using value_type = typename std::iterator_traits<Iter>::value_type; 
    value_type sum = std::accumulate(first1, last1, value_type()); 
    value_type mean = sum/(last1-first1); 

    return make_tuple(sum, mean); 
} 
3

您可能想要返回doublestd::pair而不是std::tuple。至於你的問題,你可以使用從std::iterator_traits取得的value_type成員:

template<typename Iter> 
auto 
summean(Iter first1, Iter last1) -> decltype(std::make_pair(*first1, double{})) 
{ 
    using value_type = typename std::iterator_traits<Iter>::value_type; 
    double sum = std::accumulate(first1, last1, value_type{}); 
    double mean = sum/(last1-first1); 

    return {sum, mean}; 
}