functionobject 연구 중 하나

개념


Function object는 먼저 하나의 클래스입니다. 함수 호출 조작부호 T operator () (T) 를 실현하고 T는void 형식일 수 있습니다.

가장 간단한 예: for_each

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class A {
public:
    A(): x_(0) {
    }

    void operator()(int x) {
        cout << ++x_ << endl;
    }

    int X() const {
        return x_;
    }

private:
    int x_;

};

/*
 *
 */
int main(int argc, char** argv) {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    
    A a1;
    A a2 = for_each(v.begin(), v.end(), a1);
    cout <<a1.X() << endl;
    cout <<a2.X() << endl;
    return 0;
}

출력 결과:


0

for_each의 실현


For_ 보기each의 원본 코드는 stl에서functionobject를 사용하는 기본적인 특징을 관찰할 수 있습니다.다음은 gcc4.6.1의 구현 코드입니다.
  /**
   *  @brief Apply a function to every element of a sequence.
   *  @ingroup non_mutating_algorithms
   *  @param  first  An input iterator.
   *  @param  last   An input iterator.
   *  @param  f      A unary function object.
   *  @return   @p f (std::move(@p f) in C++0x).
   *
   *  Applies the function object @p f to each element in the range
   *  @p [first,last).  @p f must not modify the order of the sequence.
   *  If @p f has a return value it is ignored.
  */
  template<typename _InputIterator, typename _Function>
    _Function
    for_each(_InputIterator __first, _InputIterator __last, _Function __f)
    {
      // concept requirements
      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
      __glibcxx_requires_valid_range(__first, __last);
      for (; __first != __last; ++__first)
        __f(*__first);
      return _GLIBCXX_MOVE(__f);
    }

_Function __f 이 매개 변수는 for_each는 function object를 복사합니다.
그리고 반복할 때마다functionobject의operator () (int) 함수를 호출합니다.왜냐면 *__first는vector 안의 현재 요소를 가리키며, 유형은 int입니다.
return _GLBCXX_MOVE(_f)는 function object를 다시 복사할 때 반환됨을 나타냅니다.
STL의 디자인은 모두 이런 방식을 사용하기 때문에functionobject는 복사 작업을 금지할 수 없고 가능한 한 작아서 비교적 큰 성능과 메모리 원가를 초래하지 않도록 해야 한다.

좋은 웹페이지 즐겨찾기