gpt4 book ai didi

c++ - typeid() 面向对象的设计替代方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:10 29 4
gpt4 key购买 nike

我有以下使用 3 个不同映射的类:键始终是字符串,而值可以是字符串、整数或 float 。

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()));
}
}

基本上,我正在使用 templatetypeid() 因为我不喜欢这种依赖于 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() 版本似乎 工作,但我想知道是否有更优雅的解决方案。也许我遗漏了一些在这种情况下可能有用的面向对象的设计概念?

提前致谢。

最佳答案

这非常适合模板特化:

template<>
void MyMaps::addKey<string>(const string& key)
{
stringFields.insert(pair<string, string>(key, string()));
}

template<>
void MyMaps::addKey<int>(const int& key)
{
intFields.insert(pair<string, int>(key, int()));;
}

template<>
void MyMaps::addKey<float>(const float& key)
{
floatFields.insert(pair<string, float>(key, float()));
}

编辑:有关模板特化的语法/更多信息,请阅读:Template Specialization and Partial Template Specialization

或者更好的是,如果 boost 是一个选项并且所有 3 个 map 的键都是唯一的并且您有 3 个不同的 map 只是为了能够存储它们,那么考虑使用 boost::variant :

typedef boost::variant<string, int, float> ValueType;

class MyMap
{

public:
typedef std::map<std::string, ValueType> MapType;
template<typename T> void addKey(const std::string& key, T &val)
{
ValueType varVal= val;
allFields.insert(MapType::value_type(key, varVal));
}

private:

MapType allFields;
};

关于c++ - typeid() 面向对象的设计替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14881945/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com