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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin