2013-11-28 61 views
0

我對C++中的函數有一些困難(對我來說)問題。 我已經做了一些類,如數字,字符等。 每個類都有一個void add函數,但數字有void add(int v),字符 - void add(char c)等 在主函數中,我有Numbers和其他類的實例(麻木,字符串),我想用std: :地圖,所以我就能夠調用函數那樣:在不給參數類型的情況下綁定一個函數

func_map["numbers"]["add"](12); 

這將是相同的:

numbs.add(12); 

但是這將是對我來說更容易,如果我可以通過以下方法只給他們的名字作爲字符串(如上面的顯示)。 我該怎麼做?

+0

我想你可能會更高興使用不同的語言,JavaScript或其他東西。不是說你不能用C++工作,但是你真的在與語言打交道。 – john

+0

你確定這容易嗎?看起來更難打電話給我讀... –

+0

@BitFiddlingCodeMonkey稍後調用更容易。用戶可以輸入「numbers add 2」,我不必用很多編碼解析用戶的輸入。 –

回答

1

我會警告你不要這樣的設計。但是,如果你絕對需要這個,你必須爲你的函數定義一個通用接口。也就是說,你的函數必須具有相同的原型。例如,你可以定義一些容器類(或者使用像boost :: variant類似的東西),它可以用不同的數據類型構造,你可以編寫你的'add'函數,以便它們接受這個類的一個對象。我的意思是:

class DataContainer { 
public: 
    DataContainer(int n) { int_data_ = n; } 
    DataContainer(char c) { int_data_ = c; } 
    DataContainer(const string s) { string_data_ = s; } 
// let them be public to make code shorter 
    int int_data_; 
    string string_data_; 
}; 

typedef void (*OpMethod)(const DataContainer); 

void NumberAdd(const DataContainer data) { 
    // work with data.int_data_ 
} 

map<string, map<string, OpMethod> > funcmap; 

... 
    funcmap["number"]["add"] = NumberAdd; 

綁定類的方法會有點困難(你也應該指定一個對象實例)。考慮使用std :: function。

相關問題