Você pode 'aprender' o tamanho da matriz automaticamente:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Felizmente, você pode alterar a interface para set_data como acima. Ele ainda aceita uma matriz no estilo C como seu primeiro argumento. Acontece apenas por referência.
Como funciona
[Atualização: Veja aqui para uma discussão mais abrangente sobre como aprender o tamanho]
Aqui está uma solução mais geral:
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);
}
Isso funciona porque a matriz está sendo transmitida como uma referência a uma matriz. No C / C ++, você não pode passar uma matriz como uma função; em vez disso, ela se deteriorará para um ponteiro e você perderá o tamanho. Mas em C ++, você pode passar uma referência para a matriz.
Passar uma matriz por referência requer que os tipos correspondam exatamente. O tamanho de uma matriz faz parte de seu tipo. Isso significa que podemos usar o parâmetro N do modelo para aprender o tamanho para nós.
Pode ser ainda mais simples ter essa função que retorna um vetor. Com as otimizações apropriadas do compilador em vigor, isso deve ser mais rápido do 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);
}