从迭代器中推断模板函数返回类型的值类型
Deducing value type from iterator for return type of template function
使用这个从容器中计算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);
}
您可能希望返回double
的std::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};
}
相关文章:
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?