2016-11-01 10 views
26

을 유형 ID. 프로그램 실행이나 컴파일간에 결과가 동일 할 필요는 없습니다. 나는 그 타입들에 대해 유일해야한다. 다른 유형에 대해 동일한 이름을 반환 할 수 있지만 일반적으로 const, 포인터 등을 사용합니다. 내 경우에는 Tclass XY, struct XX 또는 파생 된 유형입니다.- 내가 내 자신의 해시 계산이</p> <pre><code>typeid(T).name() </code></pre> <p>를 사용하고, C++ 11에서 고유성

이 경우 T은 고유 할 것이라고 가정 할 수 있습니까?

+0

관련 : http://stackoverflow.com/questions/28861760/what-is-the-actual-purpose-of-stdtype-infoname T'이 고유'을 보장 할 수 –

+0

있는 유일한 사람은 당신입니다 . 올바른 질문을하셨습니까? –

답변

25

매핑 목적으로 std::type_index을 사용해야합니다.

type_index 클래스는 STD 래퍼 클래스 :: 오브젝트있는 type_info 연관 인덱스와 정렬되지 연관 컨테이너로 사용될 수있다. type_info 객체와의 관계는 포인터를 통해 유지되는 이므로 type_index는 CopyConstructible 및 CopyAssignable입니다.

+0

그리고'type_index'는 이런 식으로 안전합니까? 예 : 서로 다른 타입의 'type_index'도 존재하지 않을 것인가? –

+1

@MartinPerry가 표준을 자세히 살펴보면 유일성에 대한 확고한 의지는 없지만 5.2.8에는 몇 가지 단서가 있습니다. 또한, Stroustrup 자신은 typeid (즉, type_info 객체)의 주소를 사용하여 typeinfo 시스템을 확장하고 고유성을 가정 할 것을 제안했습니다. – Christophe

+3

@MartinPerry를 따르는 구현은'std :: type_info' 지적 자로 전달하는 것 이상을 수행 할 수 없습니다. 그러나'type_index'를 사용하면'type_info'를 유효한 키로 만드는 것과 관련된 세부 사항을 처리합니다. * 그런 다음, * 기본,'std :: hash' 전문화가 준 최적 방식으로 작동하는 것을 발견하면, 커스텀'Hasher' 타입을 만들 수 있습니다 (또는 현재 사용중인 것으로 대체하십시오). – StoryTeller

19

std::type_info::name은 구현에 따라 정의되므로 다른 유형에 고유하지 않아야합니다.

해시 계산을 위해이 작업을 수행 중이므로 대신 std::type_info::hash_code을 사용해야합니다. 이것은 값이 고유 할 것이라는 보장은 없지만, 구현시 다양한 유형에 대해 다른 값을 반환해야한다고 표준에서 규정하고 있습니다. 해시 맵 구현에 합리적인 충돌 처리가 있으면이 정도면 충분합니다. cppreference에 언급 한 바와 같이

+5

'std :: type_info :: hash_code'는 타입간에 고유하지 않을 수도 있습니다! – themagicalyang

+0

@themagicalyang 정말요? 표준에서는 "구현에서는 이 아닌 두 개의 type_info 객체에 대해 서로 다른 값을 반환해야합니다."라고 말합니다. – TartanLlama

+0

본질적으로 초안을 확인하지는 않았지만 cppreference는 "동일한 유형을 참조하는 type_info 객체와 동일한 불특정 값을 반환합니다. 다른 보장은 제공되지 않습니다. 예를 들어 다른 값에 대해 동일한 값이 반환 될 수 있습니다 값은 또한 같은 프로그램의 호출간에 변경 될 수 있습니다. " – themagicalyang

5

:

이 유형의 이름을 포함하는 null로 끝나는 문자열 정의 구현을 돌려줍니다. 보장이 없으므로 에서 특히 반환되는 문자열은 여러 유형에서 동일 할 수 있으며 동일한 프로그램의 호출간에 이 변경 될 수 있습니다.

아니, 할 수 없습니다. 실제로 아무 것도 추측 할 수 없습니다.

있지만, hash_code() 당신에게 제공합니다

size_t hash_code() const noexcept;

7 반환 값 : 지정되지 않은 값 것을 제외하고 프로그램의 단일 실행 내를, 어떤 두 있는 type_info에 대해 동일한 값을 반환하여야한다 동일한 객체를 비교합니다.

8 참고 : 구현시과 비교되지 않는 두 개의 type_info 개체에 대해 다른 값이 반환되어야합니다.

hash_code()type_info을위한 경우에만 operator==이를 지원하는 두 가지 유형을 구분하는 데 사용 될 수 있다는 것을 의미합니다.

2

회원이 할 수있는 일은 회원의 주소입니다.

class HashBase { 
    virtual intptr_t get() = 0; 
}; 

template <typename T> 
class Hash : HashBase { 
    static const int _addr = 0; 
    intptr_t get() override { return reinterpret_cast<intptr_t>(&_addr); } 
};