typeid Operator

Sintaks

typeid(type-id)
typeid(expression)

Keterangan

Operator typeid memungkinkan jenis objek ditentukan pada waktu proses.

Hasilnya typeid adalah const type_info&. Nilai adalah referensi ke type_info objek yang mewakili jenis-id atau jenis ekspresi, tergantung pada bentuk typeid mana yang digunakan. Untuk informasi selengkapnya, lihat Kelas type_info.

Operator typeid tidak berfungsi dengan jenis terkelola (deklarator atau instans abstrak). Untuk informasi tentang mendapatkan Type jenis yang ditentukan, lihat typeid.

Operator typeid melakukan pemeriksaan run-time saat diterapkan ke nilai l dari jenis kelas polimorfik, di mana jenis objek yang sebenarnya tidak dapat ditentukan oleh informasi statis yang disediakan. Kasus tersebut adalah:

  • Referensi ke kelas

  • Penunjuk, didereferensikan dengan *

  • Penunjuk subskrip ([ ]). (Tidak aman menggunakan subskrip dengan penunjuk ke jenis polimorfik.)

Jika ekspresi menunjuk ke jenis kelas dasar, namun objek sebenarnya dari jenis yang berasal dari kelas dasar tersebut, type_info referensi untuk kelas turunan adalah hasilnya. Ekspresi harus menunjuk ke jenis polimorfik (kelas dengan fungsi virtual). Jika tidak, hasilnya adalah type_info untuk kelas statis yang dirujuk dalam ekspresi. Selanjutnya, penunjuk harus didereferensikan sehingga objek yang digunakan adalah objek yang ditunjukkannya. Tanpa mendereferensikan pointer, hasilnya akan menjadi type_info untuk pointer, bukan apa yang ditunjukkannya. Contohnya:

// expre_typeid_Operator.cpp
// compile with: /GR /EHsc
#include <iostream>
#include <typeinfo>

class Base {
public:
   virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main() {
   Derived* pd = new Derived;
   Base* pb = pd;
   cout << typeid( pb ).name() << endl;   //prints "class Base *"
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"
   delete pd;
}

Jika ekspresi mendereferensikan penunjuk, dan nilai penunjuk tersebut adalah nol, typeid akan menampilkan pengecualian bad_typeid. Jika penunjuk tidak menunjuk ke objek yang valid, __non_rtti_object pengecualian akan dilemparkan. Ini menunjukkan upaya untuk menganalisis RTTI yang memicu kesalahan karena objek entah mengapa tidak valid. (Misalnya, itu adalah pointer yang buruk, atau kode tidak dikompilasi dengan /GR).

Jika ekspresi bukan penunjuk, dan bukan referensi ke kelas dasar objek, hasilnya adalah referensi yang type_info mewakili jenis ekspresi statis. Jenis ekspresi statis mengacu pada jenis ekspresi seperti yang diketahui pada waktu kompilasi. Semantik eksekusi diabaikan saat mengevaluasi jenis ekspresi statis. Selain itu, referensi diabaikan jika memungkinkan saat menentukan jenis ekspresi statis:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

int main()
{
   typeid(int) == typeid(int&); // evaluates to true
}

typeid juga dapat digunakan dalam templat untuk menentukan jenis parameter templat:

// expre_typeid_Operator_3.cpp
// compile with: /c
#include <typeinfo>
template < typename T >
T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}

Lihat juga

Informasi Jenis Run-Time (RTTI)
Kata kunci