枚举值(int)到类型的动态映射

kok*_*ing 4 c++ mapping enums

看来这个问题在我们的工作中非常普遍.

我们通过网络发送int或enum值,然后我们收到它我们想要创建/调用特定的对象/函数.

最简单的解决方案是使用switch语句,如下所示:

switch (value) {
    case FANCY_TYPE_VALUE: return new FancyType();
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我们会有很多这些开关块,当我们创建新的值和类型时,我们需要更改所有这些.看起来确实如此.

其他可能性是使用模板.但我们不能,因为枚举的值是在运行时定义的.

是否有任何正确的设计模式,或任何正确的方法?

这似乎是每天编码中非常普遍和常见的问题......

Ker*_* SB 5

试试地图:

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()]();
Run Code Online (Sandbox Code Playgroud)

(这当然是非常粗糙的;至少你有错误检查,并且每个班级的自我注册计划,所以你不能忘记注册一个班级.)