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<int>::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
类型是编译器从first
和last
参数推导出来的。
然后,std::begin 和 std::end 函数都返回容器的迭代器。在您的情况下,这些是 std::vector 迭代器。
因此,ForwardIt
被推断为 std::vector 迭代器的一种类型,您不必显式指定它。
同样的逻辑也适用于其他算法。
【讨论】:
@Zlatomir 感谢您以更好的措辞提供答案)【参考方案2】:std::begin
和 std::end
返回迭代器,因此您无需明确告诉编译器。此外,当您将向量作为参数传递给这两个函数时,编译器将知道模板参数。
【讨论】:
以上是关于c++ stl函数模板类型推导的主要内容,如果未能解决你的问题,请参考以下文章