Поддержка характеристик типов компилятором (расширения компонентов C++)
Компилятор поддерживает характеристики типов, которые отображают различные характеристики типа во время компиляции.
Все среды выполнения
Примечания
Характеристики типов особенно полезны программистам, которые создают библиотеки.
В следующей таблице описаны характеристики типов, поддерживаемые компилятором. Все характеристики типов возвращают 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, если тип является классом или объединением без конструктора или закрытых или защищенных нестатических членов, базовых классов, виртуальных функций. Дополнительные сведения о POD см. в разделе 8.5.1/1, 9/4 и 3.9/10 стандарта C++. __is_pod вернет false для фундаментальных типов.
|
__is_polymorphic(type) |
Возвращает true, если собственный тип имеет виртуальные функции.
|
__is_ref_array(type) |
Возвращает true, если передается массив платформы. Для получения дополнительной информации см. Массивы (расширения компонентов C++).
|
__is_ref_class(type) |
Возвращает true, если передается ссылочный класс. Дополнительные сведения об определяемых пользователем ссылочных типах см. в разделе Классы и структуры (расширения компонентов C++).
|
__is_sealed(type) |
Возвращает true, если передается платформа или собственный тип, который отмечен как запечатанный. Для получения дополнительной информации см. sealed (Расширения компонентов C++).
|
__is_simple_value_class(type) |
Возвращает true, если передается тип значения, который не содержит ссылки на кучу со сбором мусора. Дополнительные сведения об определяемых пользователем типах значений см. в разделе Классы и структуры (расширения компонентов C++).
|
__is_union(type) |
Возвращает true, если тип является объединением.
|
__is_value_class(type) |
Возвращает true, если передается тип значения. Дополнительные сведения об определяемых пользователем типах значений см. в разделе Классы и структуры (расширения компонентов C++).
|
Среда выполнения Windows
Примечания
Характеристика типа __has_finalizer(type) не поддерживается, потому что эта среда не поддерживает методы завершения.
Требования
Параметр компилятора: /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