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

标签 c++ enums mapping

看来这个问题在我们的工作中很常见。

我们通过网络发送一个 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/

相关文章:

将区间映射到较小区间的算法

c# - T4 生成的代码需要访问不同的命名空间/项目

c++ - C++ 中的枚举

c# - 确定类型是否为枚举类型的通用列表

c++ - Visual Studio 2015 上的日志

NHibernate 多对一映射 : If parent is null, 将外键设置为空 Guid 而不是 null

java - 问题: Java. util.date在 hibernate 中不允许重复的日期值

c++ - 是否有帮助组织#includes 的工具?

c++ - 通过指针更改 const 值 C++

c++ - 如何打印结构的每个成员