作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
看来这个问题在我们的工作中很常见。
我们通过网络发送一个 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/
我是一名优秀的程序员,十分优秀!