Può essere fatto solo per gli aggregati (array e determinate classi. Contrariamente alla credenza popolare, questo funziona anche per molti nonpod). Non è possibile scrivere un costruttore che li prenda.
Dato che lo hai taggato come "C++ 0x", questo è comunque possibile. Le parole magiche sono "costruttore inizializzatore-lista". Questo va come
Phenotype(std::initializer_list<uint8> c) {
assert(c.size() <= std::size(m_array));
std::copy(c.begin(), c.end(), m_array);
}
// used like
Phenotype p1{1, 2, 3};
Phenotype p2({1, 3, 2}); // works too
Phenotype p3(1, 2, 3); // doesn't work
Tuttavia, tale inizializzazione creerà di default l'array e quindi utilizzerà l'operatore di assegnazione. Se miri alla velocità e alla sicurezza (ricevi errori di compilazione per troppi inizializzatori!), Puoi anche usare un costruttore ordinario con un modello variadico.
Questo può essere più generico del necessario (spesso una lista di inizializzazione è sufficiente, soprattutto per numeri interi semplici). Gode di inoltro perfetto, in modo che un argomento rvalue può essere costruito spostarsi in un elemento di un array
template<typename ...T>
Phenotype(T&&...t):m_array{ std::forward<T>(t)... } {
}
// used like
Phenotype p1{1, 2, 3};
Phenotype p2(1, 2, 3); // works too
Phenotype p3({1, 2, 3}); // doesn't work
E 'una scelta difficile!
Modifica correzione, l'ultima opera anche, come non abbiamo fatto il costruttore explicit
, in modo che possa utilizzare il costruttore copia di Phenotype
, costruire un oggetto temporaneo Phenotype
e copiarlo verso p3
. Ma non è quello che vorremmo fossero le chiamate :)
possibile duplicato (http://stackoverflow.com/questions/3424727/can-we- pass-array-as-arguments-to-functions-by-this-syntax-under-upcoming-c0x) – kennytm