使用这个简单的代码片段来尝试多个返回值,该片段可以计算容器的总和和平均值。
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};
}
该演示使用双精度计算作为演示。在计算元组的返回类型时,是否有一种优雅的方法来使用容器中值的精度?
答案 0 :(得分:5)
您可以使用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);
}
答案 1 :(得分:3)
您可能希望返回std::pair
double
而不是std::tuple
。至于您的问题,您可以使用value_type
中的std::iterator_traits
成员:
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};
}