Anda dapat 'mempelajari' ukuran array secara otomatis:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Semoga Anda dapat mengubah antarmuka ke set_data seperti di atas. Ia masih menerima larik gaya-C sebagai argumen pertamanya. Kebetulan mengambilnya dengan referensi.
Bagaimana itu bekerja
[Pembaruan: Lihat di sini untuk diskusi yang lebih komprehensif tentang mempelajari ukuran]
Ini solusi yang lebih umum:
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);
}
Ini berfungsi karena array dilewatkan sebagai referensi-ke-an-array. Dalam C / C ++, Anda tidak bisa melewatkan array sebagai fungsi, sebaliknya ia akan membusuk ke sebuah pointer dan Anda kehilangan ukurannya. Namun dalam C ++, Anda bisa meneruskan referensi ke array.
Melewati sebuah array dengan referensi membutuhkan tipe yang tepat. Ukuran array adalah bagian dari tipenya. Ini berarti kita dapat menggunakan parameter template N untuk mempelajari ukurannya bagi kita.
Mungkin lebih sederhana untuk memiliki fungsi ini yang mengembalikan vektor. Dengan optimalisasi kompiler yang berlaku, ini harus lebih cepat daripada yang terlihat.
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);
}