2011-12-30 3 views

답변

24

type_info 개체를 키로 사용하여 map<type_info*, value>에 넣을 것을 고려하십시오. type_info에는 operator <이 정의되어 있지 않으므로 직접 비교기를 제공해야합니다.

struct compare { 
    bool operator()(const type_info* a, const type_info* b) const { 
     return a->before(*b); 
    } 
}; 

std::map<const type_info*, std::string, compare> m; 

void f() { 
    m[&typeid(int)] = "Hello world"; 
} 
+1

"* type_info에는 연산자가 정의되어 있지 않으므로 비교기를 제공해야합니다. *"'std :: less <>'('std :: map <>'s default comparitor)는 ** 모든 ** 포인터에 대해 작동하지만, 정렬 순서 대신 주소 순서 만 얻습니다. – ildjarn

+6

@ildjarn : 문제를 오해하겠습니다. 표준은 타입 당 최대 하나의'type_info '가 존재한다는 것을 보장하지 않습니다. 실제로 같은 타입을 위해 생성 된 하나 이상의'typeinfo' *가 발생하는 것이 일반적입니다. 디트 마르 (Dietmar)와 마찬가지로 가장 단순한 사례는 동적으로 링크 된 라이브러리의 맥락이다. – ybungalobill

+1

@ildjarn 인용문을 다시 읽으십시오. 'type_info'의'operator < '에 대해서 이야기하지만,'type_info'에 대한 포인터 비교의 타당성에 대해 논증합니다. 따옴표가있는 문장이 어떻게 든 잘못되었음을 암시합니다. 그러나 포인터를 비교하는 것에 대해서는 아무 말도하지 않았기 때문에 그렇지 않습니다. 그런데 왜 사람들이 관련없는 의견을 씁니까? – ybungalobill

1

주문이 있습니다.

std :: map과 같은 일부 컨테이너에 값을 저장하려는 경우 필요합니다.

4

이것은 예를 들어, 소속 카테고리 오브젝트에 주문을 정의하는 데 유용합니다 : 어느 쪽도 type_info의 주소 나 name() 고유 없어야합니다 이후 type_info 인터페이스에서 작동이 보장되는 유일한 방법은 before() 기능입니다 그것들을 std :: map에 넣으십시오. 확실한 후속 질문은 다음과 같습니다. 왜 철자가 맞지 않는가 <()? 나는이 질문에 대한 답을 모른다.

+2

"명백한 후속 질문은 다음과 같습니다. 철자가 맞지 않는 이유는 무엇입니까? (*?)"포인터 유형에 대해 연산자 <를 어떻게 정의합니까? – ildjarn

+0

'type_info'에는 복사 생성자 또는 복사 할당 연산자가 없으므로 컨테이너에 직접 저장할 수 없습니다. 물론 연관 컨테이너의 핵심 유형은 참조가 될 수 없으므로 나머지 옵션은 '연산자'를 제공 할 수없는'type_info * '를 저장하는 것뿐입니다. 아마도 합리적인 일은'std :: less '을 전문화하는 것입니다. – ildjarn

+1

@ildjarn : Dietmar의 질문은 'type_info'가'before()'을 가지고 있지만'operator <''가 아닌 이유입니다.당신이 말하는 말이 정확하지만, 그의 질문에 대답하지 않습니다. 예 : 왜'typeid (int) ybungalobill

1

type_info 개체의 경우보다 작음 (<) 연산자로 생각하십시오. 혹시 주문한 컬렉션 (예 :지도 세트)에 저장하고 싶다면이를 사용하여 적절한 비교자를 만들 수 있습니다. 고유하지 않은 유형의 이름을 사용하는 것과는 달리 신뢰할 수 있고 선호되는 방식입니다.

관련 문제