0

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

4 に答える 4

2

この特定の署名は、型については何も述べていません。これは 3 つの引数を受け入れるテンプレートで、そのうちの 2 つは同じ型です。

入力引数の型にどのような制限が課されているかを確認するには、 の実装を読む必要があります_For_each

STL ソース コードを読むことは、まったくの悪夢です。

したがって、コメントで提案されているように、それをあきらめてドキュメントを読んでください。

于 2012-11-06T15:52:14.263 に答える
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
});
于 2012-11-06T15:52:39.610 に答える
0

基本的に、std::for_eachこれを行います:

_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{
  for (; _First < _Last; ++_First)
    _Func(*_First);

  return _Func;
}

したがって、ご覧のとおり、_Funcはaを取り、*_InIt何も返さない関数です(実際には、何でも返すことができますが、戻り値は破棄されます)。したがって_Fn1、をとる関数へのポインタ、または演算子をとる*_InItファンクターのいずれかになります。()*_InIt

関数の戻り値がある場合は破棄_Fn1されますが、実際にファンクターである場合は、実行後に確認できる内部状態を持つことができますstd::for_each。これが、このアルゴリズムがを返す理由_Fn1です。

于 2012-11-06T16:01:51.560 に答える
0

これはstd::for_eachfrom libcxxの実装です。

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。ただし、これは 1 つの実装にすぎません。他の実装では、より厳密に標準に準拠したり、他の機能を動作させたりすることができます。

于 2012-11-06T15:57:49.003 に答える