2017-02-21 13 views
4

일반적으로 동적 유형 지정 프로그래밍 언어에서 개체 구조체에는 개체 유형을 식별하는 데 사용되는 태그 필드가 있습니다. 예를 들어 :C 스위치 문에서 포인터를 사용할 수있는 방법이 있습니까?

struct myObject { 
    int tag; 
    ... 
} 

는 그래서는 태그 필드를 기준으로 switch 문을 사용하여 다른 작업을 수행하기 쉽습니다. 예를 들어 : 내 경우 대신 내가 그 객체를 나타내는 클래스를 가리키는 무효 *의 ISA 포인터를 사용 INT 태그 필드에

switch (obj->tag) { 
    case OBJ_INTEGER: ... 
    case OBJ_STRING: ... 
    case OBJ_FUNC:... 
} 

. 잘 작동하는 모든 것은 우아한 switch 문을 사용하는 대신 일련의 if/else 문을 사용해야한다는 것을 기대합니다. 예를 들어 :

if (obj->isa == class_integer) { 
    ... 
} else if (obj->isa == class_string) { 
    ... 
} else if (obj->isa == class_func) { 
    ... 
} 

나는 내가 C 스위치 문 내부 포인터를 사용할 수 없다는 것을 알고 있지만 나는 if 문 일련의 속도를 빠르게하기 위해 일부 영리한 트릭을 사용할 수 있는지 궁금.

+0

switch을 대체 할 수 ? 이미 컴파일러가 그렇게하지 않았습니까? –

+2

상수가 아닌 표현식을'case' 레이블로 사용할 수 없습니다. –

+0

@EugeneSh. 나는 OP가 이미 그것을 알고 있다고 생각하니? :) –

답변

14

isa 포인터의 장점은 switch 문을 완전히 없애는 기능입니다.

는 스위치를 고려

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; 
} 

이의 당신이 자신의 일부 struct-isa 포인터 포인트한다고 가정 해 봅시다 - 말 struct dyn_type을. 이런 식으로, 당신의 struct에 함수 포인터를 추가

typedef void (*ProcessPtr)(dyn_obj * obj); 

struct dyn_type { 
    ... // fields of your current struct 
    ProcessPtr process; 
}; 
OBJ_INTEGER에 대한 do_something_int

설정 process 필드, OBJ_STRING에 대한 do_something_str, 이제 당신이 "속도 향상"어떤 종류의

((struct dyn_type*)obj->isa)->process(obj) 
+1

곧 C++을 발명하게 될 것입니다. :) – rici

+0

이것은 일반적인 OO 패턴입니다. : 여러분이 객체의 클래스/isa를 보는 조건문/switch 문을 사용하면 코드 냄새입니다. 99 %의 케이스에서 메소드를 호출해야합니다. – uliwitness