请解释某人应该如何推断 std :: for_each的_Func参数的类型规范?
问题背后的动机是理解方法签名的类型要求。
template<class _InIt, class _Fn1> inline
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func) {
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
_For_each(_Unchecked(_First), _Unchecked(_Last), _Func);
return (_STD move(_Func));
}
答案 0 :(得分:2)
这个特殊的签名根本没有关于类型的说法。它是一个接受3个参数的模板,其中2个属于同一类型。
要了解对输入参数的类型施加了什么限制,您应该阅读_For_each
的实现,我打赌它将有两十个特化和委托。
阅读STL源代码绝对是一场噩梦。
因此,正如评论中提出的那样,放弃并阅读文档。
答案 1 :(得分:1)
查看一些文档,并查看示例。
http://msdn.microsoft.com/en-us/library/e5sk9w9k(v=vs.100).aspx
基本上,谓词函数应该接受与container::value_type
类型相同的参数。
std::vector<int> myNumbers;
std::for_each(std::begin(myNumbers), std::end(myNumbers), [](const int number)
{
// Do something with the number
});
答案 2 :(得分:0)
这是来自libcxx的std::for_each
的实施。
template <class _InputIterator, class _Function>
inline _Function
for_each(_InputIterator __first, _InputIterator __last, _Function __f)
{
for (; __first != __last; ++__first)
__f(*__first);
return _VSTD::move(__f);
}
这里很清楚_Function
的“合同”是什么。但是,这只是一种实现,其他实现可以更严格地遵循标准,或允许其他工作。
答案 3 :(得分:0)
基本上,std::for_each
执行此操作:
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{
for (; _First < _Last; ++_First)
_Func(*_First);
return _Func;
}
因此,正如您所看到的,_Func
是一个函数,它接受*_InIt
并且不返回任何内容(事实上,它可以返回任何内容,但返回值将被丢弃)。因此,_Fn1
可以是指向采用*_InIt
的函数的指针,也可以是其运算符()
采用*_InIt
的仿函数。
即使函数的返回值(如果有)被丢弃,如果_Fn1
实际上是一个仿函数,它可以具有内部状态,您可以在执行std::for_each
后检查。这就是该算法返回_Fn1
的原因。