C ++에서 ‘typeid’와 ‘typeof’ 된 type_info 문서에 언급되어 있습니다. typeofC

C ++ typeidtypeofC ++ 의 차이점이 무엇인지 궁금합니다 . 내가 아는 것은 다음과 같습니다.

  • typeidC ++ 헤더 파일 typeinfo에 정의 된 type_info 문서에 언급되어 있습니다.

  • typeofC 및 C ++ Boost 라이브러리 의 GCC 확장에 정의되어 있습니다.

또한, 내가 찾은 곳에서 내가 만든 typeid예상 코드를 반환하지 않는 테스트 코드 테스트가 있습니다. 왜?

main.cpp

#include <iostream>  
#include <typeinfo>  //for 'typeid' to work  

class Person {  
    public:
    // ... Person members ...  
    virtual ~Person() {}  
};  

class Employee : public Person {  
    // ... Employee members ...  
};  

int main () {  
    Person person;  
    Employee employee;  
    Person *ptr = &employee;  
    int t = 3;  

    std::cout << typeid(t).name() << std::endl;  
    std::cout << typeid(person).name() << std::endl;   // Person (statically known at compile-time)  
    std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)  
    std::cout << typeid(ptr).name() << std::endl;      // Person * (statically known at compile-time)  
    std::cout << typeid(*ptr).name() << std::endl;     // Employee (looked up dynamically at run-time  
                                                       // because it is the dereference of a pointer
                                                       // to a polymorphic class)  
 }  

산출:

bash-3.2$ g++ -Wall main.cpp -o main  
bash-3.2$ ./main   
i  
6Person  
8Employee  
P6Person  
8Employee



답변

C ++ 언어는와 같은 것이 없습니다 typeof. 컴파일러 별 확장을보고 있어야합니다. GCC에 대해 이야기하고 있다면 typeof키워드를 통해 비슷한 기능이 C ++ 11에 decltype있습니다. 다시, C ++에는 그러한 typeof키워드 가 없습니다 .

typeid런타임에 유형 식별 정보를 리턴하는 C ++ 언어 연산자입니다. 기본적으로 type_info다른 type_info객체 와 동등한 객체를 반환 합니다.

반환 된 type_info객체 의 정의 된 유일한 속성은 동일성과 비등가 비교 가능하다는 것입니다. 즉, type_info서로 다른 유형을 type_info설명 하는 객체는 동일 하지 않은 것을 비교해야하지만 동일한 유형을 설명 하는 객체는 동일하게 비교해야합니다. 그 밖의 모든 것은 구현 정의되어 있습니다. 다양한 “이름”을 리턴하는 메소드는 사람이 읽을 수있는 것을 리턴한다고 보장하지 않으며, 아무것도 리턴하지 않을 수도 있습니다.

또한 위의 내용은 표준에 명시 적으로 언급하지 않았지만 typeid동일한 유형 의 연속 응용 프로그램이 다른 type_info객체를 반환 할 수 있음을 의미 합니다 (물론 여전히 동일하게 비교해야 함).


답변

이 둘의 주요 차이점은 다음과 같습니다.

  • typeof는 컴파일 타임 구문이며 컴파일 타임에 정의 된대로 형식을 반환합니다.
  • typeid는 런타임 구성이므로 값의 런타임 유형에 대한 정보를 제공합니다.

typeof 참조 : http://www.delorie.com/gnu/docs/gcc/gcc_36.html

typeid 참조 : https://en.wikipedia.org/wiki/Typeid


답변

typeidRTTI (런타임 유형 정보) 를 클래스에 저장 하려면 런타임시 작동하고 객체의 런타임 유형을 설명하는 객체를 반환 할 수 있습니다. 또한 런타임 유형 정보가있는 클래스에 대한 포인터가 제공되지 않은 경우 컴파일 시간 유형의 표현식 또는 유형 이름을 제공 할 수 있습니다.

typeofGNU 확장이며 컴파일 타임에 모든 표현 유형을 제공합니다. 예를 들어, 여러 유형에 사용될 수있는 매크로에서 임시 변수를 선언하는 데 유용 할 수 있습니다. C ++에서는 일반적으로 템플릿을 대신 사용 합니다.


답변

추가 질문에 답변 :

typeid에 대한 다음 테스트 코드가 올바른 유형 이름을 출력하지 않습니다. 뭐가 문제 야?

문제가 없습니다. 보이는 것은 유형 이름의 문자열 표현입니다. 표준 C ++은 컴파일러가 클래스의 정확한 이름을 내도록 강요하지 않으며 적합한 것을 결정하는 것은 구현 자 (컴파일러 공급 업체)에 달려 있습니다. 요컨대, 이름은 컴파일러에 달려 있습니다.


이들은 두 가지 다른 도구입니다. typeof식의 유형을 반환하지만 표준이 아닙니다. C ++ 0x에는 decltypeAFAIK와 동일한 작업을 수행하는 것이 있습니다.

decltype(0xdeedbeef) number = 0; // number is of type int!
decltype(someArray[0]) element = someArray[0];

반면 typeid다형성 유형과 함께 사용됩니다. 예를 들어, 다음을 cat유도 한다고 가정 해 봅시다 animal.

animal* a = new cat; // animal has to have at least one virtual function
...
if( typeid(*a) == typeid(cat) )
{
    // the object is of type cat! but the pointer is base pointer.
}


답변

typeid는 요청시 런타임시 데이터 유형을 제공합니다. Typedef는 그 이후에 명시된대로 새 유형을 정의하는 컴파일 시간 구성입니다. C ++에는 typeof가 없습니다 (출력 주석으로 표시됨).

std::cout << typeid(t).name() << std::endl;  // i
std::cout << typeid(person).name() << std::endl;   // 6Person
std::cout << typeid(employee).name() << std::endl; // 8Employee
std::cout << typeid(ptr).name() << std::endl;      // P6Person
std::cout << typeid(*ptr).name() << std::endl;     //8Employee


답변

Boost demangle을 사용하여 멋진 이름을 얻을 수 있습니다.

#include <boost/units/detail/utility.hpp>

그리고 같은

To_main_msg_evt ev("Failed to initialize cards in " + boost::units::detail::demangle(typeid(*_IO_card.get()).name()) + ".\n", true, this);


답변