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()));
}
}
基本的に、type-within-function-name に依存するこの代替手段が気に入らないためtemplate
、 andを使用しています。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()
バージョンは機能しているようですが、もっと洗練されたソリューションがあるかどうか疑問に思っています。この場合に役立つ可能性のあるオブジェクト指向の設計概念が欠けているのではないでしょうか?
前もって感謝します。