我有以下類使用3個不同的地圖:鍵總是字符串,而值可能是字符串,整數或浮點數。typeid()面向對象的設計替代
class MyMaps
{
public:
template<typename T> void addKey(const std::string& key);
void addValue(const std::string& key, const std::string& value);
void addValue(const std::string& key, int value);
void addValue(const std::string& key, float value);
private:
std::map<std::string, std::string> stringFields;
std::map<std::string, int> intFields;
std::map<std::string, float> floatFields;
};
該addValue()
功能只需添加一對新的相關地圖。什麼我工作是addKey()
模板函數:
/** Add only a key, the related value is a default one and is specified by template parameter T. */
template<typename T>
void MyMaps::addKey(const string& key)
{
if (typeid(T) == typeid(string))
{
stringFields.insert(pair<string, string>(key, string()));
}
else if (typeid(T) == typeid(int))
{
intFields.insert(pair<string, int>(key, int()));;
}
else if (typeid(T) == typeid(float))
{
floatFields.insert(pair<string, float>(key, float()));
}
}
基本上,我使用template
和typeid()
,因爲我不喜歡這樣的替代方案,依靠類型中,函數名:
void MyMaps::addStringKey(const string& key)
{
stringFields.insert(pair<string, string>(key, string()));
}
void MyMaps::addIntKey(const string& key)
{
intFields.insert(pair<string, int>(key, int()));
}
void MyMaps::addFloatKey(const string& key)
{
floatFields.insert(pair<string, float>(key, float()));
}
第一addKey()
版本似乎的工作,但我不知道是否有一個更優雅的解決方案。也許我錯過了一些面向對象的設計概念,在這種情況下可能會有所幫助?
在此先感謝。
我不確定所有的鍵都不一樣。所以模板專業化可能是我正在尋找的。唯一的問題是,我不知道我必須在我的課堂上聲明什麼和正確的語法。 – eang 2013-02-14 20:55:14
刪除語法不會更改。我給出的實現是定義/實現語法 – eladidan 2013-02-14 21:06:08