std::function 실현 원리 약술

10007 단어 C++11 일반 특성
실제로 모든 function 실례는 함수 유형의 반환값과 매개 변수 유형에 따라 특례화를 추론한 다음에 클래스의 구성원 변수로 이 함수 유형으로 생성된 함수 바늘을 보존하고 사용할 때 실제로 이 클래스의 괄호 연산자를 호출해서 다시 불러옵니다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_;// };

좋은 웹페이지 즐겨찾기