1

関数を保持して後で呼び出すことができるクラスを作成しようとしています。関数の名前を保持する文字列とともに、関数をマップに格納します。

LinuxでGCCを使用してこれを実行しようとすると、次のエラーが発生"invalid conversion from void(*)() to void *"しました。functionsMap[nameOfFunction] = func;

これが私がこれまでに持っているプログラム全体です。まだ完了していませんが、なぜこれがGCCではなくVisualC++でコンパイルされるのか非常に興味があります。私が何か間違ったことをしている、またはもっと良いことをしている可能性がある場合は、私に知らせてください。ありがとう!

#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; 
}
4

3 に答える 3

2

引数を取らずにvoidを返す関数へのポインターのマップを作成するには、次のものが必要です。

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

add_funcテンプレートはでインスタンス化された場合にのみ機能するため、テンプレートを作成しても意味がありませんReturnValue = void(実装に潜在的に危険なキャストを追加しない限り)。

コードがVisualC++でコンパイルされる場合、それはVisualC++が許容されているためです。

于 2012-05-14T20:48:51.047 に答える
0

この関数を次のようなパラメータとして渡すことができます。

void add(void * f()){...}

Cで関数をパラメーターとしてどのように渡しますか?

于 2012-05-14T20:57:03.650 に答える
0

代わりにstd::functionを使用することを検討してください。

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]();
    }
}; 

利点?「関数」を使用すると、プレーンな古い関数ポインターを使用したり、ファンクターを使用したり、代わりにラムダ式を使用したりできます。

DynClass dyn;
dyn.add("print", []() { printf("Say hi"; } );
于 2012-05-14T22:58:49.697 に答える