2012-05-14 3 views
1

나는 함수를 호출하고 나중에 호출 할 수있는 클래스를 만들려고합니다. 함수의 이름을 저장하는 문자열과 함께 함수를 맵에 저장합니다. GCC에서 C++ 함수 포인터 클래스가 컴파일되지 않습니까?

나는 GCC와 리눅스에서이 일을 시도하고 다음과 같은 오류가 발생했습니다 : "invalid conversion from void(*)() to void *"을 줄 functionsMap[nameOfFunction] = func;

에 여기에 지금까지 가지고있는 전체 프로그램입니다. 아직 완료되지는 않았지만 GCC가 아닌 Visual C++에서 왜 컴파일 될지 궁금합니다. 내가 잘못한 일을하거나 더 나은 일을 할 수 있다면 저에게 알려주십시오. 감사! (하지 않는 한

std::map<std::string, void(*)()> functionsMap; 

add_funcReturnValue = void 인스턴스화하는 경우에만 작동으로 템플릿을 만드는 아무 소용이 없다 :

#include <iostream> 
#include <map> 
#include <string> 
using namespace std; 

class Dyn_Class{ 
private: 
    map<string, void *> functionsMap; 

public: 
    Dyn_Class(){} 

    template<typename ReturnValue> 
    void add_func(string nameOfFunction, ReturnValue(*func)()){ 
     functionsMap[nameOfFunction] = func; 
    } 

    void remove_func(string nameOfFunction){ 

    } 

    Dyn_Class operator()(string nameOfFunction){ 

    } 
}; 

void print(void){ 
    for(int index = 0; index < 9; index++){ 
     cout << index << " "; 
    } 
    cout << endl; 
} 

int main(){ 
    Dyn_Class functionsList; 

    functionsList.add_func("print", print); 

    return 0; 
} 

답변

2

는 당신이 필요로하는 인수를 복용하지 않고 무효를 반환하는 기능에 대한 포인터의지도를하게하려면 그 구현에 잠재적으로 안전하지 않은 캐스트를 추가합니다).

Visual C++로 코드를 컴파일하는 경우 Visual C++가 허용되어 있기 때문입니다.

+0

가변 수의 함수를 사용하려면 어떻게해야합니까? 인수를 가진 함수를 받아들이도록 add_func를 오버로드 했습니까? – Cuthbert

+0

@ d2jxp : 함수 서명이 함수 포인터 유형의 일부이기 때문에 함수 포인터를 사용하여이를 수행 할 수 없습니다. 지도에서 가져온 기능을 올바르게 호출하는 방법은 무엇입니까? –

0

는 표준을 사용 :: 기능을 대신에 생각 :

class Dyn_Class{ 
private: 
    map<string, function<void()> > functionsMap; 

public: 
    Dyn_Class(){} 

    template<typename FUNC> 
    void add_func(const string& nameOfFunction, FUNC func){ 
     functionsMap.insert(make_pair(nameOfFunction, func)); 
    } 

    void remove_func(const string& nameOfFunction){ 

    } 

    void operator()(const string& nameOfFunction){ 
     functionsMap[nameOfFunction](); 
    } 
}; 

혜택? "function"을 사용하면 평범한 함수 포인터를 사용할 수 있습니다. 펑터를 사용하거나 람다 식을 대신 사용할 수 있습니다 :

DynClass dyn; 
dyn.add("print", []() { printf("Say hi"; });