typeid (расширения компонентов C++)
Получает значение, показывающее тип объекта.
Все среды выполнения
Синтаксис
T::typeid
Параметры
- T
Имя типа.
среда выполнения Windows
Синтаксис
Platform::Type^ type = T::typeid;
Параметры
- T
Имя типа.
Заметки
В C++/CX typeid возвращает значение Platform::Type, которое формируется из данных типа во время выполнения.
Требования
Параметр компилятора: /ZW
Среда CLR
Синтаксис
type::typeid
Параметры
- type
Имя типа (абстрактное объявление типа), для которого требуется объект System::Type.
Заметки
typeid используется для получения объекта Type для типов во время компиляции.
typeid аналогично получению System::Type для типа во время выполнения с помощью GetType или GetType.Однако typeid принимает только имя типа в качестве параметра.Если требуется использовать экземпляр типа для доступа к его имени System::Type, нужно использовать GetType.
typeid должен иметь возможность оценивать имя типа (тип) во время компиляции, тогда как GetType оценивает тип для получения во время выполнения.
typeid может взять имя собственного типа или псевдоним среды CLR для имени собственного типа; дополнительные сведения см. в разделе Эквиваленты собственным типам C++ в .NET Framework (C++/CLI).
typeid также работает с собственными типами, хотя он по-прежнему возвращает System::Type.Чтобы получить структуру type_info, используйте оператор typeid.
typeid — последователь в __typeof в приведенном выше синтаксисе /clr.
Требования
Параметр компилятора: /clr
Примеры
Пример
В следующем примере сравниваются ключевое слово typeid и член GetType().
// keyword__typeid.cpp
// compile with: /clr
using namespace System;
ref struct G {
int i;
};
int main() {
G ^ pG = gcnew G;
Type ^ pType = pG->GetType();
Type ^ pType2 = G::typeid;
if (pType == pType2)
Console::WriteLine("typeid and GetType returned the same System::Type");
Console::WriteLine(G::typeid);
typedef float* FloatPtr;
Console::WriteLine(FloatPtr::typeid);
}
Вывод
Пример
Следующий пример демонстрирует, что переменную типа System::Type можно использовать для получения атрибутов типа.Он также показывает, что для некоторых типов, необходимо создать typedef для использования typeid.
// keyword__typeid_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
typedef int ^ handle_to_int;
typedef int * pointer_to_int;
public ref class MyClass {};
class MyClass2 {};
[attribute(AttributeTargets::All)]
ref class AtClass {
public:
AtClass(Type ^) {
Console::WriteLine("in AtClass Type ^ constructor");
}
};
[attribute(AttributeTargets::All)]
ref class AtClass2 {
public:
AtClass2() {
Console::WriteLine("in AtClass2 constructor");
}
};
// Apply the AtClass and AtClass2 attributes to class B
[AtClass(MyClass::typeid), AtClass2]
[AttributeUsage(AttributeTargets::All)]
ref class B : Attribute {};
int main() {
Type ^ MyType = B::typeid;
Console::WriteLine(MyType->IsClass);
array<Object^>^ MyArray = MyType -> GetCustomAttributes(true);
for (int i = 0 ; i < MyArray->Length ; i++ )
Console::WriteLine(MyArray[i]);
if (int::typeid != pointer_to_int::typeid)
Console::WriteLine("int::typeid != pointer_to_int::typeid, as expected");
if (int::typeid == handle_to_int::typeid)
Console::WriteLine("int::typeid == handle_to_int::typeid, as expected");
}
Вывод