의 std::type_info::before()
기능 ... 유형이 우 조합 순서에서의 유형을 앞에 경우`type_info :: before`는 무엇에 유용합니까? cplusplus.com에 따르면
true를 반환합니다.
데이터 정렬 순서는 특정 구현에 의해 유지되는 내부 순서이며 상속 관계 또는 선언 순서와 반드시 관련이있는 것은 아닙니다.
그래서 무엇에 유용합니까?
의 std::type_info::before()
기능 ... 유형이 우 조합 순서에서의 유형을 앞에 경우`type_info :: before`는 무엇에 유용합니까? cplusplus.com에 따르면
true를 반환합니다.
데이터 정렬 순서는 특정 구현에 의해 유지되는 내부 순서이며 상속 관계 또는 선언 순서와 반드시 관련이있는 것은 아닙니다.
그래서 무엇에 유용합니까?
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";
}
주문이 있습니다.
std :: map과 같은 일부 컨테이너에 값을 저장하려는 경우 필요합니다.
이것은 예를 들어, 소속 카테고리 오브젝트에 주문을 정의하는 데 유용합니다 : 어느 쪽도 type_info
의 주소 나 name()
고유 없어야합니다 이후 type_info
인터페이스에서 작동이 보장되는 유일한 방법은 before()
기능입니다 그것들을 std :: map에 넣으십시오. 확실한 후속 질문은 다음과 같습니다. 왜 철자가 맞지 않는가 <()? 나는이 질문에 대한 답을 모른다.
"명백한 후속 질문은 다음과 같습니다. 철자가 맞지 않는 이유는 무엇입니까? (*?)"포인터 유형에 대해 연산자 <를 어떻게 정의합니까? – ildjarn
'type_info'에는 복사 생성자 또는 복사 할당 연산자가 없으므로 컨테이너에 직접 저장할 수 없습니다. 물론 연관 컨테이너의 핵심 유형은 참조가 될 수 없으므로 나머지 옵션은 '연산자'를 제공 할 수없는'type_info * '를 저장하는 것뿐입니다. 아마도 합리적인 일은'std :: less
@ildjarn : Dietmar의 질문은 'type_info'가'before()'을 가지고 있지만'operator <''가 아닌 이유입니다.당신이 말하는 말이 정확하지만, 그의 질문에 대답하지 않습니다. 예 : 왜'typeid (int)
type_info
개체의 경우보다 작음 (<
) 연산자로 생각하십시오. 혹시 주문한 컬렉션 (예 :지도 세트)에 저장하고 싶다면이를 사용하여 적절한 비교자를 만들 수 있습니다. 고유하지 않은 유형의 이름을 사용하는 것과는 달리 신뢰할 수 있고 선호되는 방식입니다.
"* type_info에는 연산자가 정의되어 있지 않으므로 비교기를 제공해야합니다. *"'std :: less <>'('std :: map <>'s default comparitor)는 ** 모든 ** 포인터에 대해 작동하지만, 정렬 순서 대신 주소 순서 만 얻습니다. – ildjarn
@ildjarn : 문제를 오해하겠습니다. 표준은 타입 당 최대 하나의'type_info '가 존재한다는 것을 보장하지 않습니다. 실제로 같은 타입을 위해 생성 된 하나 이상의'typeinfo' *가 발생하는 것이 일반적입니다. 디트 마르 (Dietmar)와 마찬가지로 가장 단순한 사례는 동적으로 링크 된 라이브러리의 맥락이다. – ybungalobill
@ildjarn 인용문을 다시 읽으십시오. 'type_info'의'operator < '에 대해서 이야기하지만,'type_info'에 대한 포인터 비교의 타당성에 대해 논증합니다. 따옴표가있는 문장이 어떻게 든 잘못되었음을 암시합니다. 그러나 포인터를 비교하는 것에 대해서는 아무 말도하지 않았기 때문에 그렇지 않습니다. 그런데 왜 사람들이 관련없는 의견을 씁니까? – ybungalobill