我有以下类使用 3 个不同的映射:键始终是字符串,而值可能是字符串、整数或浮点数。
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
andtypeid()
因为我不喜欢这种依赖于type-within-function-name 的替代方案:
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()
版本似乎工作,但我想知道是否有更优雅的解决方案。也许我错过了一些在这种情况下可能有用的面向对象的设计概念?
提前致谢。