std :: for_each签名和参数的类型规范

时间:2012-11-06 15:43:39

标签: c++

请解释某人应该如何推断 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));
}

4 个答案:

答案 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)

这是来自libcxxstd::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的原因。