Puede 'aprender' el tamaño de la matriz de forma automática:
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 que el anterior. Todavía acepta una matriz estilo C como primer argumento. Simplemente sucede tomarlo por referencia.
Cómo funciona
[Actualización: Ver here para una discusión más amplia sobre el aprendizaje del tamaño]
Aquí es 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);
}
Este funciona porque la matriz se pasa como referencia-a-una-matriz. En C/C++, no puede pasar una matriz como una función, sino que se degradará a un puntero y perderá el tamaño. Pero en C++, puede 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 la 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 de compilador adecuadas 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);
}
La clave del problema es que no hay forma de que el vector sepa si se utilizó el mismo asignador para crear su matriz estilo C. Como tal, el vector debe asignar memoria usando su propio asignador. De lo contrario, podría simplemente cambiar la matriz subyacente y reemplazarla con su matriz. – Void