C ++ typeid
과 typeof
C ++ 의 차이점이 무엇인지 궁금합니다 . 내가 아는 것은 다음과 같습니다.
-
typeof
C 및 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
답변
typeid
RTTI (런타임 유형 정보) 를 클래스에 저장 하려면 런타임시 작동하고 객체의 런타임 유형을 설명하는 객체를 반환 할 수 있습니다. 또한 런타임 유형 정보가있는 클래스에 대한 포인터가 제공되지 않은 경우 컴파일 시간 유형의 표현식 또는 유형 이름을 제공 할 수 있습니다.
typeof
GNU 확장이며 컴파일 타임에 모든 표현 유형을 제공합니다. 예를 들어, 여러 유형에 사용될 수있는 매크로에서 임시 변수를 선언하는 데 유용 할 수 있습니다. C ++에서는 일반적으로 템플릿을 대신 사용 합니다.
답변
추가 질문에 답변 :
typeid에 대한 다음 테스트 코드가 올바른 유형 이름을 출력하지 않습니다. 뭐가 문제 야?
문제가 없습니다. 보이는 것은 유형 이름의 문자열 표현입니다. 표준 C ++은 컴파일러가 클래스의 정확한 이름을 내도록 강요하지 않으며 적합한 것을 결정하는 것은 구현 자 (컴파일러 공급 업체)에 달려 있습니다. 요컨대, 이름은 컴파일러에 달려 있습니다.
이들은 두 가지 다른 도구입니다. typeof
식의 유형을 반환하지만 표준이 아닙니다. C ++ 0x에는 decltype
AFAIK와 동일한 작업을 수행하는 것이 있습니다.
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);