質問

私は何時間 typeidtypeof C++.ここでは、知ってい:

  • typeid 指定されたドキュメンテーションに type_info で定義されたC++ヘッダファイル typeinfo.

  • typeof で定義されてGCC拡張のためのCおよびC++ Boost 図書館があります。

また、こちらのコード試験の試験が私がいることを発見し 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話をしている場合は、同様の機能は、キーワードdecltypeてC ++ 11に存在しています。ここでも、C ++には、このようなtypeofキーワードがありません。

typeidは、実行時にタイプ識別情報を返すC ++言語の演算子です。これは基本的に平等、匹敵する他のtype_infoオブジェクトであるtype_infoオブジェクトを返す。

type_infoは、同じタイプと比較する必要が記述オブジェクトながら

は注意が返さtype_infoオブジェクトの唯一の定義されたプロパティが有する、そのはequality-非平等、同等、すなわち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と呼ばれるものがあります。

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.
}
尋ねたときに

型IDは、実行時にデータの種類を提供します。 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

あなたは見栄えの良い名前を達成するためにブーストを復号化を使用することができます

#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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top