Supporto del compilatore per tratti di tipo (Estensioni del componente C++)
I supporti del compilatore digitare i tratti, che indicano le varie caratteristiche di un tipo in fase di compilazione.
Tutti i runtime
Note
Tratti di tipo sono particolarmente utili per i programmatori che scrivono librerie.
Nella tabella seguente sono elencati i tratti del tipo supportati dal compilatore.Tutti i tratti del tipo restituito 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 corrispondente del tipo è anche supportato in Estensioni componenti Visual C++ non diversamente specificato.Il termine “, tipo di piattaforma„ fa riferimento ai tipi di Windows Runtime o tipi di Common Language Runtime).
Tratto di tipo |
Descrizione |
---|---|
__has_assign(type) |
Restituisce true se la piattaforma o il tipo nativo dispone di 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 supportato 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 vuota di eccezione.
|
__has_nothrow_constructor(type) |
Restituisce true se il costruttore predefinito include una specifica vuota di eccezione.
|
__has_nothrow_copy(type) |
Restituisce true se il costruttore di copia ha una specifica vuota di eccezione.
|
__has_trivial_assign(type) |
Restituisce true se il tipo presenta un operatore di assegnazione 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 ha un distruttore semplice e generato dal compilatore.
|
__has_user_destructor(type) |
Restituisce true se la piattaforma o il tipo nativo ha un distruttore utente-dichiarato.
|
__has_virtual_destructor(type) |
Restituisce true se il tipo ha un distruttore virtuale. Di__has_virtual_destructor funziona anche nei tipi di piattaforma e il 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++). Di__is_abstract funziona anche per i tipi di piattaforma.Un'interfaccia con almeno un membro è un tipo astratto, come è un tipo di riferimento ad 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 tipo, in se entrambi i tipi sono uguali. Di__is_base_of funziona anche sui 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'enumerazione nativa.
|
__is_interface_class(type) |
Restituisce true se è stato passato a 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 unione senza un costruttore o membri privati e protetti di non statici, non sono classi base e non funzioni virtuali.Vedere lo standard C++, sezioni 8.5.1/1, il 9/4 e i 3.9/10 per ulteriori informazioni sui baccelli. __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 passata una matrice 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 a un tipo nativo come sealed.Per ulteriori informazioni, vedere sealed (Estensioni del componente C++).
|
__is_simple_value_class(type) |
Restituisce true se è stato passato un tipo di valore che non contiene riferimenti all'heap sottoposto a garbage collection.Per ulteriori informazioni sui tipi di valore definito 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 è stato passato un tipo di valore.Per ulteriori informazioni sui tipi di valore definito dall'utente, vedere Classi e struct (Estensioni del componente C++).
|
Windows Runtime
Note
Il tratto di tipo di __has_finalizer(tipo) non è supportato in quanto questa piattaforma non supporta i finalizzatori.
Requisiti
Opzione del compilatore: /ZW
Common Language Runtime
Note
(Non esistono commenti specifici della piattaforma per questa funzionalità.)
Requisiti
Opzione del compilatore: /clr
Esempi
Esempio
Nell'esempio di codice seguente viene illustrato come utilizzare il 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