通常在动态类型编程语言中,对象struct具有用于标识对象类型的标记字段。 例如:
struct myObject {
int tag;
...
}
因此,使用基于标记字段的switch语句可以轻松执行不同的操作。 例如:
switch (obj->tag) {
case OBJ_INTEGER: ...
case OBJ_STRING: ...
case OBJ_FUNC:...
}
在我的情况下,我使用了一个void * isa指针而不是int标记字段,该指针指向代表该对象的类。一切正常,我不得不使用优雅的switch语句而不是使用一系列if / else语句。例如:
if (obj->isa == class_integer) {
...
} else if (obj->isa == class_string) {
...
} else if (obj->isa == class_func) {
...
}
我知道我不能在C switch语句中使用指针,但我想知道我是否可以使用一些聪明的技巧来加速if语句系列。
答案 0 :(得分:14)
首先使用switch (obj->tag) {
case OBJ_INTEGER: do_something_int(obj); break;
case OBJ_STRING: do_something_str(obj); break;
case OBJ_FUNC: do_something_func(obj); break;
}
指针的美妙之处在于能够完全省去switch语句。
考虑一个开关:
isa
让我们说struct
指针指向您拥有的某些struct dyn_type
- 比如struct
。添加一个指向typedef void (*ProcessPtr)(dyn_obj * obj);
struct dyn_type {
... // fields of your current struct
ProcessPtr process;
};
的函数指针,如下所示:
process
为do_something_int
设置OBJ_INTEGER
字段为do_something_str
,为OBJ_STRING
设置switch
等等。现在,您可以将((struct dyn_type*)obj->isa)->process(obj)
替换为
[object Object]