我正在编写一个需要存储大量不同基元和类的类。我决定为每种不同的数据类型制作一张地图,其中地图中的关键字是变量的名称,地图中的值将是变量的值。我的地图定义如下:
std::unordered_map<std::string, int> myInts;
std::unordered_map<std::string, float> myFloats;
std::unordered_map<std::string, Something> mySomethings;
对于每个地图,我必须编写两个方法,一个用于获取某个变量的值,另一个用于设置某个变量的值,如下所示:
void setMyInt(const std::string &varName, int newVal) {
myInts[varName] = newVal;
}
int getMyInt(const std::string &varName) {
return myInts[varName];
}
这一切都很简单,但是,我最终得到了8个不同的地图,其中16个获得了设定方法。这对我来说似乎不是非常有效或干净,更不用说每次我需要存储新的数据类型时,我必须定义一个新的地图并编写2个新的get-set方法。
我考虑去掉get set方法,而是编写2个模板方法,这些方法将接受用户需要获取或设置的变量类型,然后访问正确的集合来执行操作,如下所示:
template<class Type>
void getVariable<Type>(const std::string &varName) {
// if Type == int -> return myInts[varName];
// else if Type == float -> return myFloats[varName];
}
这似乎是一种非常糟糕的方法,因为用户可以传入类不支持的类型,并且该方法打破了C ++不是非常通用的规则。
我的另一个想法是编写一些Variable类,它将包含此类应存储的所有字段,以及一些定义该类实际用于的变量的枚举,然后制作此Variable类的映射像这样:
enum Type {
TYPE_INT,
TYPE_FLOAT,
TYPE_SOMETHING
class Variable {
Type type;
int myInt;
float myFloat;
Something mySomething;
}
std::unordered_map<std::string, Variable> myVariables;
但这似乎也是一个非常糟糕的解决方案,或者至少有一个难以理解的解决方案。是否有一些聪明的方法可以使这个类存储不同的类型?
答案 0 :(得分:0)
如下所示的模板类:
template<typename ValueType>
class UnorderedStringMap : public std::unordered_map<std::string, ValueType> {
public:
...
void setValue(const std::string &varName, ValueType newVal) {
std::unordered_map::operator[](varName) = newVal;
}
const ValueType& getValue(const std::string &varName) {
return std::unordered_map::operator[](varName);
}
...
}
UnorderedStringMap<int> myInts;
UnorderedStringMap<float> myFloats;
然后您可以将它用作普通的std :: unordered_map。