Se ho un modello che avvolge un container standard, sembra che posso ragionevolmente delegare facilmente il costruttore initializer_list:Opzionalmente costruzione di supporto initializer_list per i modelli di contenitori da imballaggio forse
template<typename T>
struct holder {
T t_;
holder() :
t_() {}
holder(std::initializer_list<typename T::value_type> values)
: t_(values) {}
};
Quindi, questo funziona bene con std :: vector , per esempio.
int main(int argc, char* argv[]) {
holder<std::vector<int>> y{1,2,3};
return EXIT_SUCCESS;
}
Ma abbastanza, ovviamente, non funziona per T come 'int', o qualsiasi altro tipo che non ha un typedef value_type nidificato. Quindi, mi piacerebbe usare una sorta di enable_if o trucco simile per rendere il costruttore initializer_list non essere emesso a meno che T entrambi definiscano un typo type_tipo_node nid, ed è costruibile da std :: initializer_list.
Ho provato quanto segue, ma ancora non funziona, perché il compilatore (clang ++ 3.1 nel mio caso), viaggi ancora oltre l'invalido T :: value_type quando T è int:
holder(typename std::enable_if<std::is_constructible<T, std::initializer_list<typename T::value_type>>::value, std::initializer_list<typename T::value_type>>::type values)
: t_(values) {}
Qualsiasi pensieri su come esprimere il concetto "date a questo modello su T un costruttore di lista di inizializzazione su T value_type, se e solo se T ha un typo di tipo value_f e è costruibile da una lista_inizialista di T :: value_type".
è il 'initializer_list' passato per valore corretto, o dovrebbe essere passato per un certo tipo di riferimento? ('&&'?) –
@MartinBa: pass by value è corretto (e consigliato) per 'std :: initializer_list'. –
Un 'initializer_list' contiene solo un puntatore e una dimensione, quindi è ok passarlo per valore. I dati stessi non vengono copiati. –