5

So di std::is_pod. Ma controlla molto più dei tipi aggregati. Oppure, è std::is_pod solo il meglio che possiamo fare?Come verificare se T è un tipo aggregato?

Fondamentalmente, voglio scrivere un modello di funzione per this:

template <typename T> 
aggregate_wrapper<T> wrap(T&& x); 

che viene attivato solo quando T è un tipo di aggregazione.

+2

Non riesco a pensare ad alcuna applicazione pratica di un 'is_aggregate'. Per esempio. non aiuta con la serializzazione. –

+1

Se stai cercando il tipo di tratto che ti dice quando ad es. 'memcpy' è sicuro, quindi vuoi [' std :: is_trivially_copyable'] (http://en.cppreference.com/w/cpp/types/is_trivially_copyable). – ildjarn

+2

@ Cheersandhth.-Alf Voglio scrivere un modello di funzione 'wrap()' per [questo] (http://codereview.stackexchange.com/q/117744/70823), che è abilitato solo se 'T' è un tipo di aggregato. – Lingxi

risposta

4

Non esiste alcun modo per sintetizzare un modello is_aggregate. Le regole per stabilire se qualcosa partecipi all'inizializzazione aggregata non possono essere rilevate dalle tecniche di metaprogrammazione del C++ 14 (richiederebbero il supporto per la riflessione).

Il motivo generale per non averlo è la mancanza di un'esigenza esplicita. Anche nel caso di your wrapper, c'è poco danni a nell'applicarlo a tipi non aggregati, poiché la sintassi di inizializzazione uniforme può essere applicata a non aggregati. Effettuerai tutte le conversioni non explicit, ma è qualcosa che può essere risolto tramite una metaprogrammazione intelligente/enable_if ginnastica.

Il posto più utile per una cosa simile sarebbe in allocator::construct, che consentirebbe di utilizzare l'inizializzazione aggregata per costruire l'oggetto se T fosse un aggregato, mentre utilizzando il costruttore diretto chiamate altrimenti (per schivare la parte "non uniforme" di inizializzazione uniforme).

+0

Dopo un secondo pensiero, scrivere un 'wrap()' come questo potrebbe non essere una buona idea. Dato un aggregato, non si può veramente dire se l'utente vuole creare un 'aggregate_wrapper' o qualcos'altro con solo' wrap (x) '. – Lingxi

Problemi correlati