我有以下类使用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