Поддержка характеристик типов компилятором (расширения компонентов C++)
Компилятор поддерживает признаки типов, которые показывают различные характеристики типа во время компиляции.
AfxWndProc
Заметки
Признаки типа особенно полезны программистам, которые записывают библиотеки.
В следующей таблице перечислены признаки типа, поддерживаемые компилятором.Все признаки типа возвращают false, если условие, указанное по имени признака типа не выполняется.
(В столбце описание таблицы, примеры кода записываются только в C++/CLI.Но соответствующий признак типа также не поддерживается в Расширения компонентов Visual C++ если указано в противном случае.Термин «тип» относится к типам платформы или Среда выполнения Windows и типами среды CLR).
Признак типа |
Описание |
---|---|
__has_assign(type) |
Возвращает значение true, если платформа или собственный тип, имеют оператор присваивания копий.
|
__has_copy(type) |
Возвращает значение true, если платформа или собственный тип, имеющих конструктор копий.
|
__has_finalizer(type) |
(Не поддерживается в Расширения компонентов Visual C++). Возвращает true, если тип среды CLR обладает методом завершения.Дополнительные сведения см. в разделе Деструкторы и методов завершения в Visual C++.
|
__has_nothrow_assign(type) |
Возвращает значение true, если оператор присваивания копий содержит пустую спецификация исключения.
|
__has_nothrow_constructor(type) |
Возвращает значение true, если конструктор по умолчанию содержит пустую спецификация исключения.
|
__has_nothrow_copy(type) |
Возвращает значение true, если конструктор копии содержит пустую спецификация исключения.
|
__has_trivial_assign(type) |
Возвращает true, если тип имеет тривиальный, компилятором оператор присваивания.
|
__has_trivial_constructor(type) |
Возвращает true, если тип имеет тривиальный, компилятором конструктором.
|
__has_trivial_copy(type) |
Возвращает true, если тип имеет тривиальный, компилятором конструктором копии.
|
__has_trivial_destructor(type) |
Возвращает true, если тип имеет тривиальный, компилятором деструктор.
|
__has_user_destructor(type) |
Возвращает значение true, если платформа или собственный тип, имеют пользователь-объявленный деструктор.
|
__has_virtual_destructor(type) |
Возвращает true, если тип имеет виртуальный деструктор. __has_virtual_destructor также работает с типами платформы и любые определяемые пользователем деструктор в типе платформы виртуальный деструктор.
|
__is_abstract(type) |
Возвращает true, если тип абстрактным типом.Дополнительные сведения о типах рефераты собственного см. в разделе abstract (расширения компонентов C++). __is_abstract также работает для типов платформы.Интерфейс по крайней мере с одним членом абстрактный тип, ссылочный тип с хотя бы один абстрактный элементом.Дополнительные сведения об абстрактных типах платформ см. в разделе Абстрактные классы (C++)
|
__is_base_of(base,derived) |
Возвращает значение true, если первый тип второго аргумента базовый класс типа, если оба эти же типа. __is_base_of также работает с типами платформы.Например, она возвратит true, если первый тип interface class (расширения компонентов C++) и второй тип реализует интерфейс.
|
__is_class(type) |
Возвращает true, если тип собственные класса или структуры.
|
__is_convertible_to(from, to) |
Возвращает значение true, если первый тип может быть преобразован на второй тип.
|
__is_delegate(type) |
Возвращает значение true, если type делегат.Дополнительные сведения см. в разделе delegate (расширения компонентов C++).
|
__is_empty(type) |
Возвращает true, если тип не содержит члены данных экземпляра.
|
__is_enum(type) |
Возвращает true, если тип собственные перечисления.
|
__is_interface_class(type) |
Возвращает значение true, если передаются в интерфейсе платформы.Дополнительные сведения см. в разделе interface class (расширения компонентов C++).
|
__is_pod(type) |
Возвращает true, если тип является классом или объединение без конструктора или закрытых или защищенных non-статических элементов, нет базовых классов и без виртуальных функций.Стандарт C++, см. в разделах 8.5.1/1, 9/4 и 3.9/10 дополнительные сведения о стручках. __is_pod возвращает значение false для основных типов.
|
__is_polymorphic(type) |
Возвращает значение true, если собственный тип имеет виртуальные функции.
|
__is_ref_array(type) |
Возвращает значение true, если передается массив платформы.Дополнительные сведения см. в разделе Массивы (расширения компонентов C++).
|
__is_ref_class(type) |
Возвращает значение true, если передаются классом ссылки.Дополнительные сведения об определяемых пользователем типах см. в разделе Классы и структуры (расширения компонентов C++) ссылочных.
|
__is_sealed(type) |
Возвращает значение true, если передаются платформе или собственный тип пометил sealed.Дополнительные сведения см. в разделе sealed (расширения компонентов C++).
|
__is_simple_value_class(type) |
Возвращает значение true, если передаются типом значения, который не содержит ссылок на мусор-собранной куче.Дополнительные сведения об определяемых пользователем типах значений см. в разделе Классы и структуры (расширения компонентов C++).
|
__is_union(type) |
Возвращает true, если тип соединения.
|
__is_value_class(type) |
Возвращает значение true, если передаются типом значения.Дополнительные сведения об определяемых пользователем типах значений см. в разделе Классы и структуры (расширения компонентов C++).
|
Среда выполнения Windows
Заметки
Признак типа __has_finalizer(тип) не поддерживается, так как эта платформа не поддерживает методы завершения.
Требования
Параметр компилятора: /ZW
Среда CLR
Заметки
(Нет примечания платформа-специфического для этой функции).
Требования
Параметр компилятора: /clr
Примеры
Пример
В следующем примере кода показано, как использовать шаблон класса для предоставления признак типа компилятора для компиляции /clr.Дополнительные сведения см. в разделе Среда выполнения Windows и управляемые шаблоны (расширения компонентов C++).
// compiler_type_traits.cpp
// compile with: /clr
using namespace System;
template <class T>
ref struct is_class {
literal bool value = __is_ref_class(T);
};
ref class R {};
int main () {
if (is_class<R>::value)
Console::WriteLine("R is a ref class");
else
Console::WriteLine("R is not a ref class");
}
Output