functionobject 연구의 2
어떻게 인용을 전달합니까
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;
}
아직 승급 공간이 있지만 분명히 비나리_기능의 방안이 훨씬 간단해졌다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
localStorage에 객체를 추가하는 방법은 무엇입니까?이 노트에서는 localStorage에 객체를 삽입하는 방법을 보여드리겠습니다. 경우에 따라 로컬 스토리지 또는 세션 스토리지에 데이터를 개체로 저장해야 할 수 있습니다. 어떻게 이것을 달성할 수 있습니까? 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.