2009-11-04 9 views
4

현재 C++에서 이진 트리를 구현 중이며 in_order()라는 함수로이 트리를 탐색하려고합니다.C++ : 함수를 다른 함수의 매개 변수로 전달

이 함수를 인수로 전달할 수있는 방법이 있으므로 다음과 같이 할 수 있습니다 (목록을 두 번 이상 탐색하는 코드를 작성하지 않고도)?

struct tree_node; // and so on 
class tree;  // and so on 

void print_node() { 
    // some stuff here 
} 

// some other functions 

tree mytree(); 

// insert some nodes 

mytree.in_order(print_node); 
mytree.in_order(push_node_to_stack); 
mytree.in_order(something_else); 

답변

14

예, 여러 가지 방법으로이 작업을 수행 할 수 있습니다. 두 가지 일반적인 가능성이 있습니다.

이전 스타일 함수 포인터 펑 템플릿 멤버

를 사용

class mytree 
{ 
    // typedef for a function pointer to act 
    typedef void (*node_fn_ptr)(tree_node&); 

    void in_order(node_fn_ptr) 
    { 
     tree_node* pNode; 

     while (/* ... */) 
     { 
     // traverse... 
     // ... lots of code 

     // found node! 
      (*fnptr)(*pNode); 
      // equivalently: fnptr(*pNode) 
     } 
    } 
}; 

void MyFunc(tree_node& tn) 
{ 
    // ... 
} 

void sample(mytree& tree) 
{ 
    // called with a default constructed function: 
    tree.inorder(&MyFunc); 
    // equivalently: tree.inorder(MyFunc); 
} 

는, 함수 포인터와 함께 작동

class mytree 
{ 
    // typedef for a function pointer to act 
    typedef void (*node_fn_ptr)(tree_node&); 

    template<class F> 
    void in_order(F f) 
    { 
     tree_node* pNode; 

     while (/* ... */) 
     { 
     // traverse... 
     // ... lots of code 

     // found node! 
      f(*pNode); 
     } 
    } 
}; 

struct ExampleFunctor 
{ 
    void operator()(tree_node& node) 
    { 
     // do something with node 
    } 
} 

void sample(mytree& tree) 
{ 
    // called with a default constructed function: 
    tree.inorder(ExampleFunctor()); 
} 
+0

+1 30 초에 나를 이길 수 있습니다.) – AraK

+1

@AraK : 최대한 빨리 타이핑하고있었습니다 ... –

+0

덕분에 정말 많이 도와 줬습니다! –

1

예, 함수 포인터를 사용할 수 있습니다 in_order에 대한 매개 변수로 전달 된 함수의 서명이 일치하지 않는 경우에도 오버로드해야 할 수 있습니다. print_node 같은 기능, 같은 in_order 선언을 위해 (그 반환 값의 형태뿐만 아니라 void입니다 제공) :

void tree::in_order(void (*)()) 
{ 
    //implementation 
} 
1

내가 대신 방문자 패턴을 사용한다고 생각합니다.

http://en.wikipedia.org/wiki/Visitor_pattern

기본 방문자 클래스는 노드에서 운영하는 가상의 방법이 있어야합니다. 방문자를 in_order 메소드의 인수로 전달합니다. 그런 다음 원하는 모든 작업을 원하는만큼 방문자를 유도하십시오.

+1

실제로 방문자 패턴은 실제로 달성하고자하는 것보다 더 강력합니다. 전략 패턴으로 충분합니다. http://en.wikipedia.org/wiki/Strategy_pattern – Julio

+0

그것은 모두 내가 찾고있는 것이 아닙니다. 둘 다 작은 이진 트리 클래스에서 너무 부 풀릴 것이라고 생각합니다. 재미있는 개념, 그래도! –

+0

그래, 조금 더 부풀어 오르지 만, 아마 더 강력 할거야. 그리고 C++에서 작업 할 때 정적 함수를 사용하지 않으려 고 노력합니다. – Julio

관련 문제