2017-12-23 3 views
1

몇 가지 방법으로 내 함수에 내 초기화 된 함수 객체를 전달하고 싶습니다.함수 객체를 함수 인자로 전달하기

나는 "for_each"와 함께 자신의 기능을 가진 예제를 찾지 못했지만 같은 방식으로 작동해야한다는 것을 이해합니다.

void f(int& n, void (*g)(int& m)){ g(n);}; 

class TEST{ 
public: 
    int init=0; 
    TEST(int _init):init(_init){} 
    void operator() (int& m) {m+=init;} 

}; 

int main(int argc, char *argv[]) 
{ 
    int k, m; 
    cin >> k >> m; 

    TEST mytest(m); // OK, creates object with initialization 
    mytest(m);   // OK, using initialized object's "operator()" 

    f(k,mytest);  // error: cannot convert 'TEST' to 
         // 'void (*)(int&)' for argument '2'to 
         // 'void f(int&, void (*)(int&))' 

    f(k,TEST(m));  // error: cannot convert 'TEST' to 
         // 'void (*)(int&)' for argument '2'to 
         // 'void f(int&, void (*)(int&))' 

    return 0; 
} 
+1

'템플릿 공극 F (INT 및 N, F의 g) {g (N)}' –

+0

... 함수의 목적은 넓은 용어이고, 일반적으로 A * 함수로 전환되지 않기 때문에 바늘*. – StoryTeller

+0

mytest는 int가 아니며 & mytest()를 시도했습니다. –

답변

4

유형 void (*)(int& m)의 함수 포인터와 TEST의 인스턴스 사이에 공통의 무엇입니까?

이들은 int& 유형의 인수로 호출 할 수 있습니다.

다른 점은 무엇입니까?

두 가지 유형입니다. 함수 템플릿을 사용하지 않는 한,이 템플릿은 서로 바꿔서 사용할 수 없습니다.

따라서 해결책은 함수 템플릿을 사용하는 것입니다.

template <typename Callable> 
void f(int& n, Callable c) 
{ 
    c(n); 
} 
관련 문제