2017-10-15 15 views
0

차례로 함수에 대한 래퍼를 생성하는 템플릿 클래스를 만들려고합니다. 그런 다음 클래스는 래퍼를 결과로 반환합니다. 이 같은 것을 가지고 내가 좋아하는 것std :: function 및 std :: bind와 함께 C++ 템플릿 사용

  1. std::function<void()>task = std::bind(fun1, param1, param2);
  2. std::function<int(int, int)>task = std::bind(fun2, param1, param2);

: 나는 같은 다른 서명, 어떤 기능이 작동 일반적으로 클래스를 가지고 템플릿을 사용하고자하는

template <typename T1, typename T2> 
class A { 
    A (string param1, string param2) { 
    // The created wrapper here i.e. 'task' will be returned by the class. 
    function<T1>task = bind(T2, param1, param2); 
    } 

    // Return the created wrapper in the constructor. 
    function<T1> returnWrapper() { 
    return task; 
    } 
}; 

위의 코드는 컴파일 할 수 없기 때문에 거의 의사 코드이며, 내가 찾고있는 것에 대한 아이디어를 제공합니다. 이것에 대한 해결책이 있습니까? 나는 단순히 함수의 서명을위한 템플릿을 사용하는 것 이상의 것이되어야한다고 생각한다. 어떤 도움을 주시면 감사하겠습니다. 가능하다면 임의의 수의 매개 변수를 '바인딩'에 전달할 수 있기를 바랍니다.

+0

이렇게 할 수 있다면 나중에 어떻게 부르겠습니까? – aschepler

+0

완전한 의사 코드를 작성하지는 않았지만 나중에 클래스를 호출 할 수 있도록 클래스가 래퍼를 반환한다는 것이 의도입니다. 이 경우 클래스는 'task'를 반환해야합니다. – Dan

+1

아, 처음에는 모든 종류의 기능을 보유 할 수있는 하나의 공통 비 템플릿 유형이 필요하다고 생각했습니다. 하지만 형식은 여전히 ​​함수 형식 인 'T1'에 의존 할 것으로 보입니다. 'A (string, string)'은 아무 것도 반환 할 수없는 생성자입니다. 'task'는 나중에 액세스 할 수있는 클래스 멤버가 될 것입니다. 아니면'A' 타입의 객체를 직접 호출 할 수 있습니다. – aschepler

답변

0

내가 문제를 해결했다고 생각합니다! 나는 템플릿 안에 두 개의 타입 이름을 가진 클래스를 정의하고 그 중 하나를 std :: function에 캐싱 한 후 함수 시그니처로 전달하고 두 번째를 생성자에서 사용하여 std에서 카레 함수 (래핑 후 결과 함수)를 정의해야합니다 ::묶다. 모든 것이 잘되었습니다. 좀 더 나은 해결책이 있을지 모르지만, 이것이 내가 얻은 최선의 해결책이었습니다. 여기 내가 찾은 해결책의 발췌 문장이 있습니다! 같은 문제가있는 다른 사람에게 도움이 되었기를 바랍니다.

#include <iostream> 
#include <functional> 

using namespace std; 

class A { 
    private: 
    template <typename T1, typename T2> 
    class B { 
     private: 
     function<T1>ff; 

     public: 
     B(T2 fun) { 
      ff = bind(fun, 1, placeholders::_1); 
     } 

     virtual ~B() { 
     } 

     int exec(int x) { 
      return ff(x); 
     } 
    }; 

    static int myFun(int x, int y) { 
     return x + y; 
    } 

    public: 
    A() { 
    }; 

    int test() { 
     B<int(int), int (*)(int, int)> b(&myFun); 
     return b.exec(10); 
    } 

    virtual ~A() { 
    }; 
}; 

int main() { 
    A a; 

    // Correct result is '11' since we pass 11 and 1 is in the curried function. 
    cout << "test result: " << a.test() << endl; 

    return 0; 
}