1. ホーム
  2. c++

[解決済み] C++における'typeid'と'typeof'の比較

2022-03-02 02:34:10

質問

とはどう違うのでしょうか? typeidtypeof をC++で作成しました。以下は私が知っていることです。

  • typeid のドキュメントに記載されています。 タイプ_info これは、C++のヘッダーファイルで定義されている タイプインフォ .

  • typeof は、C言語のGCC拡張とC++で定義されています。 ブースト ライブラリで使用されます。

また、私が作成したテストコード・テストで 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 オブジェクトを作成します(もちろん、これらは等しく比較されなければなりません)。