Puede 'aprender' el tamaño de la matriz automáticamente:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Con suerte, puede cambiar la interfaz a set_data como se indicó anteriormente. Todavía acepta una matriz de estilo C como primer argumento. Simplemente lo toma por referencia.
Cómo funciona
[Actualización: vea aquí para una discusión más completa sobre el aprendizaje del tamaño]
Aquí hay una solución más general:
template<typename T, size_t N>
void copy_from_array(vector<T> &target_vector, const T (&source_array)[N]) {
target_vector.assign(source_array, source_array+N);
}
Esto funciona porque la matriz se pasa como una referencia a una matriz. En C / C ++, no puede pasar una matriz como una función, sino que se descompondrá en un puntero y perderá el tamaño. Pero en C ++, tú puedes pasar una referencia a la matriz.
Pasar una matriz por referencia requiere que los tipos coincidan exactamente. El tamaño de una matriz es parte de su tipo. Esto significa que podemos usar el parámetro de plantilla N para conocer el tamaño para nosotros.
Puede ser aún más simple tener esta función que devuelve un vector. Con las optimizaciones apropiadas del compilador en efecto, esto debería ser más rápido de lo que parece.
template<typename T, size_t N>
vector<T> convert_array_to_vector(const T (&source_array)[N]) {
return vector<T>(source_array, source_array+N);
}