2012-03-01 18 views
2

シェルをプログラムします。異なるパラメータを持つ関数ポインタ

私は異なるパラメータで異なる機能を持っています。

void func1(void); 
void func2(char * x,); 
void func3(char * x, string y); 

現時点では、文字列とポインタを格納するマップを使用します。

it=list.find("argument"); 
if(it != list.end()) 
{ 
if->second(); 
} 

は、マップ内の異なるパラメータですべての機能を格納することが可能です:ことを私は使用機能を見つけて開始する

typedef map<string,void (*)()> t_list; 
map<string,void(*)()>::iterator it; 
t_list list; 

list["argument1"]=&func1; 

?そしてどうやって?

+2

これらの関数をどのように呼び出すのですか?彼らの実際の署名を検査し、それらを提供された議論と一致させることができると期待していますか? –

答えて

1

妥当な解決策は、文字列のベクトルを受け取り、エラーコードを返す関数です。だから、この単一の署名:

int (*func)(std::vector<std::string> const &args) 

は次に機能であなたは引数を解析する必要があり、ファンクタを使用していないのはなぜあなたが実際の実装(例えばvoid func3(char * x, string y);

+0

または多分int(\ * func)(int argc、char \ * argv []); =) – wreckgar23

+0

@ wreckgar23:いいえ、間違いなく。それは非常に危険です。 –

0

呼び出すことができますか?彼らは使いやすく、もっとOOP linkです。

+0

おそらくそれは彼の問題を解決しないだろうから。ファンクタでさえ、マップに格納する場合は、定義された署名が必要です。 –

+0

しかし、仮想ファンクタを使用し、パラメータを別の構造として渡すことができます。それは問題を解決するはずです、そうですか? – neciu

関連する問題