Vous pouvez "apprendre" la taille du tableau automatiquement:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Heureusement, vous pouvez changer l'interface de set_data comme ci-dessus. Il accepte toujours d'un C-gamme de style en tant que premier argument. Il arrive juste à le prendre en référence.
Comment ça marche
[ Mise à jour: Voir ici pour une discussion plus complète sur l'apprentissage de la taille ]
Ici, c'est un plus de solution générale:
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);
}
Cela fonctionne parce que le tableau est passé comme une référence à un tableau. En C/C++, vous ne pouvez pas passer un tableau à une fonction, au lieu de cela, il se désintègre à un pointeur, et vous perdez la taille. Mais en C++, vous pouvez passer une référence à la matrice.
Passage d'un tableau par référence nécessite les types de correspondre exactement. La taille d'un tableau est une partie de son type. Cela signifie que nous pouvons utiliser le paramètre de modèle N pour apprendre la taille pour nous.
Il pourrait être encore plus simple d'avoir cette fonction qui retourne un vecteur. Avec appropriée les optimisations du compilateur en effet, ce devrait être plus rapide qu'il n'y paraît.
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);
}