从迭代器中推断模板函数返回类型的值类型

Deducing value type from iterator for return type of template function

本文关键字:返回类型 函数 类型 迭代器      更新时间:2023-10-16

使用这个从容器中计算sum和mean的简单代码片段来试验多个返回值。

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

示例使用双精度计算,仅作为示例。是否有一种优雅的方法可以在计算元组的返回类型时使用容器中值的精度?

您可以使用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);
}

您可能希望返回doublestd::pair而不是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};
}