Supporto del compilatore per tratti di tipo (Estensioni del componente C++)
Il compilatore supporta tratti di tipo, che indicano le varie caratteristiche di un tipo in fase di compilazione.
Tutti i runtime
Osservazioni
Tratti di tipo sono particolarmente utili per i programmatori che scrivono librerie.
La tabella seguente elenca i tratti di tipo supportati dal compilatore. Tutti i tratti di tipo restituiscono false se la condizione specificata dal nome del tratto di tipo non viene soddisfatta.
(Nella colonna descrizione della tabella, esempi di codice vengono scritti solo in C++/CLI. Ma il tratto di tipo corrispondente è supportato anche in Estensioni componenti Visual C++ a meno di una diversa dichiarazione. Il termine, "tipo di piattaforma" fa riferimento ai tipi di Windows Runtime o ai tipi di Common Language Runtime).
Tratto di Tipo |
Descrizione |
---|---|
__has_assign(type) |
Restituisce true se la piattaforma o il tipo nativo ha un operatore di assegnazione di copia.
|
__has_copy(type) |
Restituisce true se la piattaforma o il tipo nativo ha un costruttore di copia.
|
__has_finalizer(type) |
(Non supportata in Estensioni componenti Visual C++.) Restituisce true se il tipo CLR dispone di un finalizzatore. Per ulteriori informazioni, vedere distruttori e finalizzatori in Visual C++.
|
__has_nothrow_assign(type) |
Restituisce true se un operatore di assegnazione di copia ha una specifica di eccezione vuota.
|
__has_nothrow_constructor(type) |
Restituisce true se il costruttore predefinito include una specifica di eccezione vuota.
|
__has_nothrow_copy(type) |
Restituisce true se il costruttore di copia include una specifica di eccezione vuota.
|
__has_trivial_assign(type) |
Restituisce true se il tipo presenta un operatore semplice e generato dal compilatore.
|
__has_trivial_constructor(type) |
Restituisce true se il tipo presenta un costruttore semplice e generato dal compilatore.
|
__has_trivial_copy(type) |
Restituisce true se il tipo presenta un costruttore di copia semplice e generato dal compilatore.
|
__has_trivial_destructor(type) |
Restituisce true se il tipo presenta un distruttore semplice e generato dal compilatore.
|
__has_user_destructor(type) |
Restituisce true se la piattaforma o il tipo nativo presenta un distruttore dichiarato dall'utente.
|
__has_virtual_destructor(type) |
Restituisce true se il tipo presenta un distruttore virtuale. __has_virtual_destructor funziona anche sui tipi di piattaforma e ogni distruttore definito dall'utente in un tipo di piattaforma è un distruttore virtuale.
|
__is_abstract(type) |
Restituisce true se il tipo è un tipo astratto. Per ulteriori informazioni sui tipi astratti nativi, vedere abstract (Estensioni del componente C++). __is_abstract funziona anche per i tipi di piattaforma. Un'interfaccia con almeno un membro è un tipo astratto, come è un tipo di riferimento con almeno un membro astratto. Per ulteriori informazioni sui tipi di piattaforma astratti, vedere Classi astratte (C ++).
|
__is_base_of(base, derived) |
Restituisce true se il primo tipo è una classe base del secondo di tipo o se entrambi i tipi sono uguali. __is_base_of è applicabile anche ai tipi di piattaforma. Ad esempio, restituirà true se il primo tipo è classe di interfaccia (Estensioni del componente C++) e il secondo tipo implementa l'interfaccia.
|
__is_class(type) |
Restituisce true se il tipo è una classe o una struttura nativa.
|
__is_convertible_to(from, to) |
Restituisce true se il primo tipo può essere convertito nel secondo tipo.
|
__is_delegate(type) |
Restituisce true se type è un delegato. Per ulteriori informazioni, vedere delegato (Estensioni del componente C++).
|
__is_empty(type) |
Restituisce true se il tipo non dispone di membri dati di istanza.
|
__is_enum(type) |
Restituisce true se il tipo è un enum nativo.
|
__is_interface_class(type) |
Restituisce true se passata un'interfaccia della piattaforma. Per ulteriori informazioni, vedere classe di interfaccia (Estensioni del componente C++).
|
__is_pod(type) |
Restituisce true se il tipo è una classe o un'unione senza un costruttore o membri non statici privati o protected, non è una classe base e non sono funzioni virtuali. Vedere lo standard di C++, sezioni 8.5.1/1, 9/4, e 3.9/10 per ulteriori informazioni sui POD. __is_pod restituirà false sui tipi fondamentali.
|
__is_polymorphic(type) |
Restituisce true se un tipo nativo dispone di funzioni virtuali.
|
__is_ref_array(type) |
Restituisce true se passato un'array della piattaforma. Per ulteriori informazioni, vedere Matrici (Estensioni del componente C++).
|
__is_ref_class(type) |
Restituisce true se passata una classe di riferimento. Per ulteriori informazioni sui tipi di riferimento definiti dall'utente, vedere Classi e struct (Estensioni del componente C++).
|
__is_sealed(type) |
Restituisce true se passata una piattaforma o un tipo nativo segnato chiuso. Per ulteriori informazioni, vedere sealed (Estensioni del componente C++).
|
__is_simple_value_class(type) |
Restituisce true se passato un tipo di valore che non contiene riferimenti all'heap del garbage collection. Per ulteriori informazioni sui tipi di valore definiti dall'utente, vedere Classi e struct (Estensioni del componente C++).
|
__is_union(type) |
Restituisce true se un tipo è un'unione.
|
__is_value_class(type) |
Restituisce true se passato un tipo di valore. Per ulteriori informazioni sui tipi di valore definiti dall'utente, vedere Classi e struct (Estensioni del componente C++).
|
Windows Runtime
Osservazioni
Il tratto di tipo di __has_finalizer(type) non è supportato perché questa piattaforma non supporta i finalizzatori.
Requisiti
Opzione del compilatore: /ZW
Common Language Runtime
Osservazioni
Non esistono commenti specifici della piattaforma per questa funzionalità.
Requisiti
Opzione del compilatore: /clr
Esempi
Esempio
L'esempio di codice seguente mostra come utilizzare un modello di classe per esporre un tratto di tipo del compilatore per una compilazione di /clr. Per ulteriori informazioni, vedere Windows Runtime e modelli gestiti (Estensioni del componente 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