functionobject 연구의 2

어떻게 인용을 전달합니까


은 function object를 unary_function, 지금 한번 해 보세요.
class B : public unary_function<int,void>{
public:
    B():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 a;
    for_each(v.begin(),v.end(),a);
    cout<<a.x()<<endl;
    cout<<"------------"<<endl;
    B b;
    typedef vector<int>::iterator itor_type;
    for_each<itor_type,B&>(v.begin(),v.end(),b);
    cout<<b.x()<<endl;

    return 0;
}

지금 봐봐 unary_function의 원본 코드, 원리를 알아보세요.
  template<typename _Arg, typename _Result>
    struct unary_function
    {
      /// @c argument_type is the type of the argument
      typedef _Arg      argument_type;

      /// @c result_type is the return type
      typedef _Result   result_type;
    };

이런 방법은 문제를 해결할 수 있지만functionobject의 원본 코드를 수정해야 하고 for_를 사용해야 한다each는 템플릿 매개 변수의 유형을 현저하게 알려줍니다. (전편을 돌이켜보면 for_each는 템플릿 함수이고 두 개의 템플릿 매개 변수가 있습니다.) 더 많은 경우 비침입적인 방식의 간결한 방식이 필요합니다.
제가 실제 개발에서 해결 방안 중 하나는 Pimple 모드로 처리하는 것입니다. 즉, B 대상은 지침 p를 가지고 구체적인 클래스를 가리키며operator()()에서 p->operator()() 작업을 수행합니다.Effective STL에서도 이러한 장점은 다중 상태를 지원할 수 있고 값이 전달될 때 발생하는 대상 절단을 피할 수 있다는 것이다.다음은 내 자신의 실현을 보자.

자체 지원 참조 전달


앞의 Pimpl 모드의 해결 방안은 템플릿 함수가 있으면functionobject의 주소를 지침으로 다른 클래스에 저장할 수 있다는 힌트를 줄 수 있습니다.이 새 클래스도 하나의functionobject입니다. 단지operator () () () 내부의 진정한 functionobject를 간단하게 바꾸면 됩니다.다음 코드는 첫 번째 간이 버전입니다.
template<typename function_object_type,typename element_type>
class function_object_ref{
public:
    explicit function_object_ref(function_object_type & object):object_(&object){

    }

    void operator()(element_type e){
        object_->operator()(e);
    }
private:
    function_object_type* object_;
};

int main(int argc, char** argv) {
    A a2;
    function_object_ref<A,int> wrapper(a2);
    for_each(v.begin(),v.end(),wrapper);
    cout<<a2.x()<<endl;
    return 0;
}

아직 승급 공간이 있지만 분명히 비나리_기능의 방안이 훨씬 간단해졌다.

좋은 웹페이지 즐겨찾기