Prise en charge du compilateur des caractéristiques de type
Le compilateur prend en charge tapez les caractéristiques, qui montrent différentes caractéristiques d'un type au moment de la compilation.
Tous les runtimes
Remarques
Les spécifications de type sont particulièrement utiles pour les programmeurs qui écrivent des bibliothèques.
Le tableau suivant fait la liste des accessibilités de type prises en charge par le compilateur. Toutes les spécifications de type renvoient false si la condition spécifiée par le nom de la fonctionnalité de type n'est pas remplie.
(Dans la colonne description de la table, les exemples de code sont fournis uniquement dans C++/CLI. La fonctionnalité correspondante de type est également prise en charge dans Extensions de composant Visual C++ sauf indication du contraire. Le terme, « type de données » fait référence aux types Windows Runtime ou à des types CLR (common langage runtime).
Spécifications de types |
Description |
---|---|
__has_assign(type) |
Renvoie true si la plate-forme ou le type natif est un opérateur d'assignation de copie.
|
__has_copy(type) |
Renvoie true si la plate-forme ou le type natif a un opérateur de construction de copie.
|
__has_finalizer(type) |
(Non pris en charge dans Extensions de composant Visual C++). Renvoie true si le type CLR a un finaliseur. Pour plus d'informations, consultez Destructeurs et les finaliseurs dans Visual C++.
|
__has_nothrow_assign(type) |
Renvoie true si un opérateur d'assignation de la copie a une spécification vide d'exception.
|
__has_nothrow_constructor(type) |
Renvoie true si le constructeur par défaut a une spécification vide d'exception.
|
__has_nothrow_copy(type) |
Renvoie true si le constructeur de copie a une spécification vide d'exception.
|
__has_trivial_assign(type) |
Renvoie true si le type possède un opérateur d'assignation trivial et généré par le compilateur.
|
__has_trivial_constructor(type) |
Renvoie true si le type possède un constructeur trivial et généré par le compilateur.
|
__has_trivial_copy(type) |
Renvoie true si le type possède un constructeur de copie trivial et généré par le compilateur.
|
__has_trivial_destructor(type) |
Renvoie true si le type possède un destructeur trivial et généré par le compilateur.
|
__has_user_destructor(type) |
Renvoie true si la plate-forme ou le type natif a un destructeur déclaré par l'utilisateur.
|
__has_virtual_destructor(type) |
Renvoie true si le type possède un destructeur virtuel. __has_virtual_destructor fonctionne aussi sur les types de données, et tout destructeur défini par l'utilisateur dans un type de données est un destructeur virtuel.
|
__is_abstract(type) |
Renvoie true si le type est un type abstrait. Pour plus d'informations sur les types abstraits natifs, consultez résumé (Visual C++). __is_abstract fonctionne également pour les types de données. Une interface avec au moins un membre est un type abstrait, de même qu'un type référence à au moins un membre abstrait. Pour plus d'informations sur les plateformes abstraites, consultez Classes abstraites (C++).
|
__is_base_of(base, derived) |
Renvoie true si le premier type est une classe de base du second type, de si les deux types sont identiques. __is_base_of fonctionne aussi sur les types de données. Par exemple, elle renvoie true si le premier type est classe d'interface et si le second type implémente l'interface.
|
__is_class(type) |
Renvoie true si le type est une classe ou une structure native.
|
__is_convertible_to(from, to) |
Renvoie true si le premier type puisse être converti au second type.
|
__is_delegate(type) |
Renvoie true si type est un délégué. Pour plus d'informations, consultez delegate.
|
__is_empty(type) |
Renvoie true si le type n'a aucun membre de données de l'instance.
|
__is_enum(type) |
Renvoie true si le type est une énumération natif.
|
__is_interface_class(type) |
Renvoie true si transmis une interface de plateforme. Pour plus d'informations, consultez classe d'interface.
|
__is_pod(type) |
Renvoie true si le type est une classe ou une union sans le constructeur ou non les membres statiques privés ou protégés, aucune classes de base, et les fonctions virtuels. Consultez les sections 8.5.1/1, 9/4, et 3.9/10 de C++ stantdard pour plus d'information sur les PODs. __is_pod renvoie false sur les types fondamentaux.
|
__is_polymorphic(type) |
Renvoie true si un type natif contient des fonctions virtuels.
|
__is_ref_array(type) |
Renvoie true si transmis un tableau de plateforme. Pour plus d'informations, consultez tableau (Visual C++).
|
__is_ref_class(type) |
Renvoie true si transmis a une classe de référence. Pour plus d'informations sur les types de references définis par l'utilisateur, consultez Classes et structures (géré).
|
__is_sealed(type) |
Renvoie true si transmis a une plate-forme ou un type natif comme scellé. Pour plus d'informations, consultez sealed (extensions du composant C++).
|
__is_simple_value_class(type) |
Renvoie true si transmis un type de valeur qui ne contient pas de références au segment récupérés par le garbage collector. Pour plus d'informations sur les types de valeurs définis par l'utilisateur, consultez Classes et structures (géré).
|
__is_union(type) |
Renvoie true si le type est une union.
|
__is_value_class(type) |
Renvoie true si transmis un type de valeur. Pour plus d'informations sur les types de valeurs définis par l'utilisateur, consultez Classes et structures (géré).
|
Windows Runtime
Remarques
La fonctionnalité de type __has_finalizer(type) n'est pas prise en charge car cette plateforme ne prend pas en charge les finaliseurs.
Conditions requises
Option du compilateur : /ZW
Common Language Runtime
Remarques
(Il n'existe aucune note spécifique à la plateforme pour cette fonctionnalité.)
Conditions requises
Option du compilateur : /clr
Exemples
Exemple
L'exemple de code suivant montre comment utiliser un modèle de la classe pour exposer une caractéristique de type du compilateur pour une compilation /clr. Pour plus d'informations, consultez modèles managés.
// 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");
}
Sortie