c++ - 'typeid' 与 C++ 中的 'typeof'

标签 c++ typeof typeid

我想知道 C++ 中的 typeidtypeof 有什么区别。以下是我所知道的:

    type_info 的文档中提到了
  • typeid在 C++ 头文件 typeinfo 中定义.

  • typeof 在 C 的 GCC 扩展和 C++ Boost 中定义。图书馆。

另外,这是我创建的测试代码测试,我发现 typeid 没有返回我所期望的。为什么?

ma​​in.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 对象(当然,它们仍然必须比较相等)。

关于c++ - 'typeid' 与 C++ 中的 'typeof',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986418/

相关文章:

c++ - 通过网络在不同平台之间比较 boost::typeindex type hash_code() 是否安全?

c++ - typeid(equalizing) 中类型定义及其含义的区别

c++ - 确保在解锁之前调用互斥锁

c++ - static_cast<int>(long long) 安全吗?

Swift —— 等同于 typealias 中的 typeof 的惯用语

c# - 检查 T 泛型类型是否具有 C# 中的属性 S(泛型)

swift - 为什么 type(of : object) == ClassName. self 会返回错误的结果?

c++ - 我怎样才能重载序列化 boost 功能,让一个用于文件存储,另一个用于 tcp 消息?

c++ - 如何调用boost_compute 'BOOST_COMPUTE_FUNCTION'定义的函数?

c++ - 哪些平台不在 type_info op== 中使用字符串比较?