std::function 실현 원리 약술
10007 단어 C++11 일반 특성
operator()
. int sum(int a,int b){
return a+b;
}
template <typename R>
class MyFunction{};
/*
R:operator() ,Arg1,Arg1 operator()
*/
template <typename R,typename Arg1,typename Arg2>
class MyFunction<R(Arg1,Arg2)>{
public:
using Pfunc = R(*)(Arg1,Arg2); //
//typedef R(*Pfunc)(Arg...);
MyFunction(Pfunc pfunc):pfunc_(pfunc){
cout<<"call MyFunction(Pfunc pfunc)"<<"
";
}
R operator()(Arg1 a1,Arg2 a2){
cout <<"R operator()(Arg1 a1,Arg2 a2)"<<endl;
return pfunc_(a1,a2);
}
private:
Pfunc pfunc_;//
};
사용 시 표준 라이브러리와 차이가 없음:
int main(){
// function
std::function<int(int,int)> func1 = sum;
cout<<func1(10,10)<<endl;;
// fuction
MyFunction<int(int,int)> func2 = sum;
cout<<func2(10,20)<<endl; //func2.operator()(10,20)
return 0;
}
위의 방식은 우리의 수요를 만족시킬 수 있지만, 이렇게 하면 결점이 있다
std::function
보류된 호출 가능한 목표의 매개 변수 개수는 확실하지 않다. 반환값은 틀림없이 하나만 있을 뿐이다. 매번 서로 다른 매개 변수 개수에 따라 많은 다른 부분의 특례화를 일으킬 수 없다. 이렇게 하면 분명히 비현실적이다.c++ 11은 템플릿 가변 참조를 제공하여 위 템플릿을 다음과 같이 수정할 수 있습니다.template <typename R,typename... Arg>
class MyFunction<R(Arg...)>{
public:
using Pfunc = R(*)(Arg...); //
//typedef R(*Pfunc)(Arg...);
MyFunction(Pfunc pfunc):pfunc_(pfunc){
cout<<"call MyFunction(Pfunc pfunc)"<<"
";
}
R operator()(Arg... arg){
cout <<"R operator()(Arg...)"<<endl;
return pfunc_(arg...);
}
private:
Pfunc pfunc_;//
};