2012-04-25 7 views
2

가능한 중복 :
How do function pointers work?함수를 매개 변수로 전달하는 방법은 무엇입니까?

가 어떻게 매개 변수로 함수를 전달합니까?

다른 클래스의 함수를 매개 변수로 전달할 수도 있습니까 (객체를 사용합니까?)?

+0

콜백을 조회합니다. –

+0

다른 방법으로 매개 변수를 전달하는 것과 같은 방법입니다. 전달하고자하는 함수의 이름 뒤에 괄호 안에 이름을 넣는다. 어느 부분에 문제가 있습니까? 흠. 아마 그 제목이 정말로 그것을 모두 말하지 않았을까? –

답변

0

함수 포인터를 전달해야합니다. 구문은 너무 어렵지 않고 멋진 페이지 here이 있으며 c 및 C++에서 함수 포인터를 사용하는 방법에 대한 철저한 분석을 제공합니다. 해당 페이지 (http://www.newty.de/fpt/fpt.html)에서

:

//------------------------------------------------------------------------------------ 
// 2.6 How to Pass a Function Pointer 

// <pt2Func> is a pointer to a function which returns an int and takes a float and two char 
void PassPtr(int (*pt2Func)(float, char, char)) 
{ 
    int result = (*pt2Func)(12, 'a', 'b');  // call using function pointer 
    cout << result << endl; 
} 

// execute example code - 'DoIt' is a suitable function like defined above in 2.1-4 
void Pass_A_Function_Pointer() 
{ 
    cout << endl << "Executing 'Pass_A_Function_Pointer'" << endl; 
    PassPtr(&DoIt); 
} 
+0

고마워, 내가 집에 갈 때 이것을 시도 할 것이다. – user1338743

2

두 가지 방법이 있습니다.

하나는 함수 포인터 @dusktreader 개요입니다.

다른 하나는 functors 또는 함수의 매개 변수로 operator()을 오버로드하는 클래스를 정의한 다음 함수 인스턴스를 사용하고 클래스 인스턴스를 전달하는 것입니다.

나는 항상 후자를 더 직관적이라고 생각했지만, 둘 중 어느 쪽이든 할 것이다.

+0

Functor는 템플릿 기능에 전달 될 때만 작동한다. –

+0

@MarkRansom 함수 객체는 '가상'을 통해 공통 기반과 동적 디스패치를 ​​사용할 수도 있습니다. – justin

+1

@MarkRansom은'std :: functions' 일 때가 아닙니다. – juanchopanza

3

함수 포인터 외에도 std::function and std::bind (또는 C++ 11이없는 경우 boost 등가)을 사용할 수 있습니다. 이들은 polimorphic 기능 래퍼를 제공, 그래서 당신은 두 가지의 int를 취하는 std::function 받아 반환이 기능을, 정의 같은 물건을 할 수있는 더블 :

double foo(std::function<double(int, int)> f) { 
    return 100*f(5,89); 
} 

은 다음과 일치 아무것도 전달할 수있는 서명, 예를 들어 :

struct Adder { 
    double bar(double a, double b) { return a+b;} 
}; 

int main() { 
    using namespace std::placeholders; 
    Adder addObj; 
    auto fun = std::bind(&AdderC::bar, &addObj, _1, _2); // auto is std::function<double(int,int)> 

    std::cout << foo(fun) << "\n"; // gets 100*addObj.bar(5,89) 
} 

이들은 모두 강력한 기능을 사용하기 쉽고, 쓸모없는 예제로 오해하지 마십시오. 일반 함수, 정적 함수, 멤버 함수, 정적 멤버 함수, 펑터를 래핑 할 수 있습니다 ...

관련 문제