typeid(C++/CLI 和 C++/CX)
获取指明对象类型的值。
注意
本主题引用 typeid 的 C++ 组件扩展版本。 有关此关键字的 ISO C++ 版本,请参阅 typeid 运算符。
所有运行时
语法
T::typeid
参数
T
类型名称。
Windows 运行时
语法
Platform::Type^ type = T::typeid;
参数
T
类型名称。
备注
在 C++/CX 中,typeid 返回根据运行时类型信息构造的 Platform::Type。
要求
编译器选项:/ZW
公共语言运行时
语法
System::Type^ type = T::typeid;
参数
type
要为其获取 System::Type
对象的类型(抽象声明符)的名称。
注解
typeid
用于在编译时为类型获取 Type。
typeid
类似于在运行时使用 GetType 或 GetType 获取类型的 System::Type
。 但是,typeid
只接受类型名称作为参数。 如果要使用类型的实例来获取其 System::Type
名称,请使用 GetType
。
typeid
必须可以在编译时计算类型名称(类型),而 GetType 则计算要在运行时返回的类型。
typeid
可以使用本机类型名称,也可以使用本机类型名称的公共语言运行时别名;有关详细信息,请参阅相当于 C++ 本机类型的 .NET Framework 类型 (C++/CLI)。
typeid
也适用于本机类型,但仍会返回 System::Type
。 要获取 type_info 结构,请使用 typeid
运算符。
要求
编译器选项:/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);
}
typeid and GetType returned the same System::Type
G
System.Single*
下面的示例展示了类型变量 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");
}
True
in AtClass2 constructor
in AtClass Type ^ constructor
AtClass2
System.AttributeUsageAttribute
AtClass
int::typeid != pointer_to_int::typeid, as expected
int::typeid == handle_to_int::typeid, as expected