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).
fonte
2016-01-25 14:35:22
Non riesco a pensare ad alcuna applicazione pratica di un 'is_aggregate'. Per esempio. non aiuta con la serializzazione. –
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
@ 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