2014-11-02 4 views
0

내 질문에 대한 답변을 Google에서 찾지 못했습니다. (아마도 C++을 처음 사용하고 아직 모든 용어의 올바른 용어를 모르기 때문에). 제 질문은 목록에있는 함수에 대한 참조를 추가 할 수 있습니까? 그렇다면 올바른 방법은 무엇입니까?목록에 함수 참조 추가

기본적으로 내가 뭘하려는 건 몇 가지 기본적인 이벤트 처리를 할 수 있도록 목록에 함수 참조를 저장할 수있는 이벤트 클래스를 만드는 것입니다.

하고 어떤 메신저 생각이 같은 것입니다 :

list<function> fnlist; 
void add(function fn) { 
    fnlist.add(fn); 
} 
void call() { 
    for (function &fn: fnlist) { 
     fn(); 
    } 
} 

이 가능한 같은가요?
아무 것도없이이 작업을 수행 할 수 있다면 이벤트 라이브러리를 사용하지 않는 것이 좋습니다. 다음

답변

3

사용 :

/* ret_type : Return Type, 
    arg_type - type of argument (can be multiple, separated by comma) 
*/ 

typedef std::function<ret_type(arg_type)> function ; 

std::list < function> fnlist ; 


void add(function fn) 
{ 
    fnlist.add(fn); 
} 

void call() 
{ 
    for (const auto &fn: fnlist) 
    { 
     fn(); 
    } 
} 
+0

좋아, 고마워. 이것은 구현하기가 상대적으로 쉽습니다. 그러나 인수를 받아 들일 수있는 함수를 호출한다면 어떨까요? void (void)를 void (void)로 변경하겠습니까? 편집 : 고마워요. 업데이트 전에 질문을 게시했습니다. 이것은 이해할 만하다. –

+2

typedef std :: function 함수; 너는 할 수있어. – wshcdr

4

는 물론, 이것은 가능하다 :

#include <iostream> 
#include <vector> 
#include <functional> 
using namespace std; 

void quick() { 
    cout << "quick "; 
} 
void brown() { 
    cout << "brown "; 
} 
void fox() { 
    cout << "fox "; 
} 

int main() { 
    vector<function<void()> > events; 
    events.push_back(quick); 
    events.push_back(brown); 
    events.push_back(fox); 
    for (auto f : events) { 
     f(); 
    } 
    return 0; 
} 

사용 std::function<void()>이 매개 변수를 사용하지 않는, 그 결과를 반환하지 않는 호출을 캡슐화하는 기능 객체를 개최합니다.

Demo.