15

関数のマップを作成しました。これらの関数はすべて無効で、単一の文字列パラメーターを受け取ります。

コード:

void f1(string params){...}
void f2(string params){...}
void f3(string params){...}

map<string , void*> funcMap;

funcMap["f1"] =(void*)&f1;
funcMap["f2"] =(void*)&f2;
funcMap["f3"] =(void*)&f3;

関数を呼び出す方法 次のコードを試しましたが、id が機能しません:

void (*func)(string) =  &funcMap[commandType];
func(commandParam);

次のエラー メッセージが表示されます。

Server.cpp:160:46: error: cannot convert ‘void**’ to ‘void (*)(std::string) {aka void (*)(std::basic_string<char>)}’ in initialization
4

4 に答える 4

20
using pfunc = void (*)(string);

map<string, pfunc> funcMap; 
funcMap["f1"] = f1; //and so forth

そして、次のように呼び出します。

pfunc f = funcMap[commandType];
(*f)(commandParam);   

一般に、なぜタイプ セーフを捨てるのでしょうか。関数ポインターのマップである場合は、それを宣言します。

于 2012-06-14T19:42:56.903 に答える
2

それらを別々のクラスとして持たないのはなぜですか。

次に、メソッドを仮想として使用します。

その後、文字列と基本クラスの間のマップを作成できます。

すなわち

class Someoperation
{
    virtual void Doit() = 0;
};

map<string, Someopertion> ops;

それで

class MyOp : public Someoperation
{
   void Doit() { /* Some code here */}
};

オブジェクトを追加するだけ

ops["Hello"] = MyOp();

それからそれを呼び出します

ops["Hello"].Doit();
于 2012-06-14T19:50:49.303 に答える
1

&funcMap[commandType]

をドロップするだけ&です。あなたのコンパイルエラーはここで役に立ちました。関数ポインターのアドレスvoid**を取得したため、右側に がありました。そこに 2 レベルの間接性は必要ありません。

于 2012-06-14T19:41:13.770 に答える