2011-04-19 5 views
10

C++의 typeid 연산자는 텍스트 이름을 생성 할 수있는 클래스 std::type_info의 객체를 반환합니다. 그러나, 나는 모든 다형성 클래스에 대해 유일한 숫자 식별자를 얻는 것에 관심이있다. (하나의 프로그램 실행의 범위 내에서 고유 한 - 반드시 실행 사이) 실제로typeid를 통한 클래스의 숫자 고유 식별자

, 난 그냥 포인터 역 참조 vptr의 내용을 읽을 수 있습니다 -하지만이 우아한도 휴대도 할 것이다. 나는 휴대용 방식을 선호합니다.

typeid 연산자를 사용하여 클래스에 대해 "안전한"숫자 식별자를 사용할 수 있습니까? 예를 들어, std::type_info 구조의 주소가 주어진 클래스의 모든 typeid 호출에 대해 같다고 계산할 수 있습니까? 아니면 name() 포인터일까요?

+0

. 이것은 문자열 리터럴이기 때문에 컴파일시에도 해석되어야합니다. 적어도 저것은 내가 그 생각을 가지고있는 "보석"이 말한 것입니다 ... 나의 경험은 다릅니다. 나에게는 그 솔루션의 오버 헤드가 너무 높습니다. 그러나 잘, 그것은 확실히 휴대 가능하다. .. 그래. – Damon

+0

여기 실제로 해결하려는 문제는 무엇입니까? –

+0

객체의 주소를'void ** '로 캐스팅하지 못하게하고 vptr을 역 참조하려고하는 문제. : D 그리고 더 진지하게 - 2 차원 vtable과 비슷한 것. – Kos

답변

1

보인다.

+9

주의! 표준 당 : hash_code()는 두 가지 유형에 대해 다른 ID를 반환 할 필요가 없습니다. 이것은 해시 코드가 아니라 키입니다. –

+0

그래서 고유 한 것이 보장되지는 않습니까? – GameDeveloper

+0

-1이 잘못되었습니다. (위의 크리스토퍼 참조) – Petter

0

정적 데이터 멤버는 카운터를 사용하는 알고리즘으로 초기화됩니까? 그런 다음 MyClass :: id를 고유 식별자로 사용하십시오. 그런 다음 가상 함수를 사용하여 기본 클래스를 기반으로 고유 식별자를 가져옵니다. 이식성이 보장되지만 정적 변수를 구현하고 생성 한 모든 새 클래스에 대해 가상 함수를 구현해야하기 때문에 약간의 유지 관리 부담이 있습니다. 그러나 당신이 이미 장황한 것으로 알려진 C++을 사용하기로 선택했기 때문에 이것이 큰 문제는 아니라고 생각합니다. 그 결과는 다음과 같습니다 type_info::hash_code()는 C + +0 처방처럼

class Base { virtual int get_id() const=0; }; 
class Derived : public Base { static int id; int get_id() const { return id; } }; 
int algo() { static int count=0; count++; return count; } 
static int Derived::id = algo(); 
+2

그런 코드를 작성하고 유지할 필요가없는 목적을 위해 RTTI가 발명 된 것은 아니지만 가능합니까? 컴파일러의 임무는 제 일이 아니라 제 일입니다. – Kos

+0

글쎄요, 요점은 C++에서 실제로 작업을 수행하고 상용구 코드를 약간 더 많이 작성하는 경우 더 나은 코드를 얻을 수 있다는 것입니다. – tp1

4

type_info에는 설명하는 유형을 다른 type_info 객체의 유형과 비교하기위한 연산자 ==()가 있습니다. 객체는 또한 프로그램을 오래 살 수 있습니다.

그래서 두 개의 type_infos의 주소를 저장하면 *p1 == *p2이 없어서 같은 유형을 참조하는지 확인할 수 있습니다.

5

std :: type_index (C++ 11)는 유형에 따라 값을 저장하는 컨테이너에서 사용할 수 있습니다. 그것은 당신에게 숫자를주지 않을 것이다.

std::type_index index = std::type_index (typeid (int)); 

더 : 당신은 유형 ID의 이름에 해시를 계산할 수 http://en.cppreference.com/w/cpp/types/type_index

관련 문제