Solo se puede hacer para agregados (matrices y ciertas clases. Contrariamente a la creencia popular, esto también funciona para muchos nopod). Escribir un constructor que los tome no es posible.
Dado que lo etiquetó como "C++ 0x", esto es posible. Las palabras mágicas son "constructor inicializador-lista". Esto va como
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
Sin embargo, dicha inicialización construirá la matriz por defecto y luego usará el operador de asignación. Si busca velocidad y seguridad (¡obtiene errores de tiempo de compilación para demasiados inicializadores!), También puede usar un constructor ordinario con una plantilla variadica.
Esto puede ser más genérico de lo necesario (sin embargo, una initializer_list es suficiente, especialmente para enteros simples). Se beneficia de reenvío perfecto, por lo que un argumento rvalue se puede mover hacia la construyó en un elemento de matriz
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
Es una decisión difícil!
Editar Corrección, el último que trabaja demasiado, ya que no hacemos el constructor explicit
, por lo que puede utilizar el constructor copia de Phenotype
, la construcción de un objeto temporal Phenotype
y copiarlo en p3
. Pero eso no es lo que realmente queremos que sean las llamadas :)
posible duplicado de (http://stackoverflow.com/questions/3424727/can-we- pass-arrays-as-arguments-to-functions-by-this-syntax-under-upcoming-c0x) – kennytm