Aracılığıyla paylaş


typeid İşleci

Sözdizimi

typeid(type-id)
typeid(expression)

Açıklamalar

işleci typeid , bir nesnenin türünün çalışma zamanında belirlenmesine izin verir.

sonucu typeid bir const type_info&'dir. değer, kullanılan biçime bağlı olarak tür kimliğini veya ifadenin türünü temsil eden bir type_info nesne başvurusudurtypeid. Daha fazla bilgi için bkz . type_info Sınıfı.

işleç typeid yönetilen türlerle (soyut bildirimciler veya örnekler) çalışmaz. Belirtilen türü alma Type hakkında bilgi için bkz . typeid.

typeid işleci, çok biçimli sınıf türünün l değerine uygulandığında bir çalışma zamanı denetimi yapar ve burada nesnenin gerçek türü sağlanan statik bilgiler tarafından belirlenemez. Bu gibi durumlar şunlardır:

  • Bir sınıf başvurusu

  • ile başvurulmayan bir işaretçi *

  • Alt simgeli işaretçi ([ ]). (Çok biçimli bir türe işaretçiyle alt simge kullanmak güvenli değildir.)

İfade bir temel sınıf türüne işaret ederse, ancak nesne aslında bu temel sınıftan türetilmiş bir türse, türetilen sınıf için başvuru type_info sonucudur. İfade çok biçimli bir türe (sanal işlevlere sahip bir sınıf) işaret etmelidir. Aksi takdirde, sonuç ifadesinde başvuruda bulunılan statik sınıfın sonucudurtype_info. Ayrıca, işaretçinin başvurulmaması gerekir, böylece kullanılan nesne işaret eden nesnedir. İşaretçinin başvurusu kaldırılmadan sonuç, işaretçinin type_info işaret eden sonucu değil, işaretçinin sonucu olur. Örneğin:

// 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;
}

İfade bir işaretçinin başvurusu kaldırılıyorsa ve işaretçinin değeri sıfırsa, typeid bad_typeid özel durumu oluşturur. İşaretçi geçerli bir nesneye işaret etmiyorsa bir __non_rtti_object özel durum oluşturulur. Nesne bir şekilde geçersiz olduğundan bir hatayı tetikleyen RTTI'yi analiz etme girişimini gösterir. (Örneğin, bu hatalı bir işaretçi veya kod /GR ile derlenmiş değil).

İfade bir işaretçi değilse ve nesnenin temel sınıfına başvuru değilse, sonuç ifadenin statik türünü temsil eden bir type_info başvurudur. bir ifadenin statik türü , derleme zamanında bilindiği gibi bir ifadenin türüne başvurur. Yürütme semantikleri, bir ifadenin statik türü değerlendirilirken göz ardı edilir. Ayrıca, bir ifadenin statik türü belirlenirken, mümkün olduğunca başvurular da dikkate alınmaz:

// expre_typeid_Operator_2.cpp
#include <typeinfo>

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

typeid şablon parametresinin türünü belirlemek için şablonlarda da kullanılabilir:

// 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 );
}

Ayrıca bkz.

Çalışma Zamanı Tür Bilgileri
Anahtar Sözcükler