有没有一种很好的方法来组合或简化这些STL地图?

时间:2017-01-01 18:32:53

标签: c++ stl unordered-map

我正在编写一个需要存储大量不同基元和类的类。我决定为每种不同的数据类型制作一张地图,其中地图中的关键字是变量的名称,地图中的值将是变量的值。我的地图定义如下:

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;

但这似乎也是一个非常糟糕的解决方案,或者至少有一个难以理解的解决方案。是否有一些聪明的方法可以使这个类存储不同的类型?

1 个答案:

答案 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。