看来这个问题在我们的工作中很常见。
我们通过网络发送一个 int 或 enum 值,然后我们收到它,我们想创建/调用一个特定的对象/函数。
最简单的解决方案是使用 switch 语句,如下所示:
switch (value) {
case FANCY_TYPE_VALUE: return new FancyType();
}
它工作正常,但我们会有很多这样的开关 block ,当我们创建新的值和类型时,我们需要更改所有这些。这似乎是对的。
其他可能性是使用模板。但我们不能,因为枚举的值是在运行时定义的。
是否有任何正确的设计模式或任何正确的方法?
这似乎是每天编码中一个非常普遍和普遍的问题......
最佳答案
尝试一张 map :
struct Base { };
struct Der1 : Base { static Base * create() { return new Der1; } };
struct Der2 : Base { static Base * create() { return new Der2; } };
struct Der3 : Base { static Base * create() { return new Der3; } };
std::map<int, Base * (*)()> creators;
creators[12] = &Der1::create;
creators[29] = &Der2::create;
creators[85] = &Der3::create;
Base * p = creators[get_id_from_network()]();
(这当然是很粗糙的;至少你会有错误检查和每类自注册方案,这样你就不会忘记注册一个类。)
关于c++ - 枚举值 (int) 到类型的动态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11831284/