c++ stl函数模板类型推导

Posted

技术标签:

【中文标题】c++ stl函数模板类型推导【英文标题】:c++ stl functions template type deduction 【发布时间】:2017-06-22 11:28:26 【问题描述】:

我一直在四处寻找,并为 std::algorithm 编写一些基本示例,出于某种原因,我从来没有觉得它们像这样工作很奇怪:

#include <vector>
#include <algorithm>
int main()
  std::vector<int> vec;
  vec.resize( 100 );

  std::generate( std::begin( vec ), std::end( vec ), std::rand );   
  auto element = std::max_element( std::begin( vec ), std::end( vec ) );

为什么不需要这样的模板参数:

std::generate<std::vector<int>::iterator>( ... 
std::max_element<std::vector<int>::iterator>( ...

【问题讨论】:

你的标题已经有了答案...std::being(vec)std::vector&lt;int&gt;::iterator,所以不需要再告诉编译器 我不确定你在问什么。您是在问为什么不需要为 generate() 和 max_element 显式定义迭代器? std::begin 和 std::end 返回迭代器,向量的类型包含在 vec 中。 【参考方案1】:

看看std::generate可能的实现:

template<class ForwardIt, class Generator>
void generate(ForwardIt first, ForwardIt last, Generator g)

    while (first != last) 
        *first++ = g();
    

这里ForwardIt类型是编译器从firstlast参数推导出来的。

然后,std::begin 和 std::end 函数都返回容器的迭代器。在您的情况下,这些是 std::vector 迭代器。

因此,ForwardIt 被推断为 std::vector 迭代器的一种类型,您不必显式指定它。

同样的逻辑也适用于其他算法。

【讨论】:

@Zlatomir 感谢您以更好的措辞提供答案)【参考方案2】:

std::beginstd::end 返回迭代器,因此您无需明确告诉编译器。此外,当您将向量作为参数传递给这两个函数时,编译器将知道模板参数。

【讨论】:

以上是关于c++ stl函数模板类型推导的主要内容,如果未能解决你的问题,请参考以下文章

深入了解C++:auto与函数模板之推导规则辨析

推导返回类型模板 C++

带有类型推导的 swig python 模板函数

C++ STL 基础及应用 模板与操作符重载

使用 STL 容器的部分 C++ 模板特化

C++ 提高教程 模板-普通函数雨函数模板区别