Bạn có thể 'tìm hiểu' kích thước của mảng tự động:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Hy vọng, bạn có thể thay đổi giao diện thành set_data như trên. Nó vẫn chấp nhận một mảng kiểu C là đối số đầu tiên của nó. Nó chỉ xảy ra để đưa nó bằng cách tham khảo.
Làm thế nào nó hoạt động
[Cập nhật: Xem tại đây để thảo luận toàn diện hơn về việc tìm hiểu kích thước]
Đây là một giải pháp tổng quát hơn:
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);
}
Điều này hoạt động vì mảng đang được truyền dưới dạng tham chiếu đến mảng. Trong C / C ++, bạn không thể truyền một mảng dưới dạng hàm, thay vào đó nó sẽ phân rã thành một con trỏ và bạn mất kích thước. Nhưng trong C ++, bạn có thể chuyển một tham chiếu đến mảng.
Vượt qua một mảng bằng tham chiếu yêu cầu các loại khớp chính xác. Kích thước của một mảng là một phần của loại của nó. Điều này có nghĩa là chúng ta có thể sử dụng tham số mẫu N để tìm hiểu kích thước cho chúng ta.
Có thể còn đơn giản hơn khi có hàm này trả về một vectơ. Với tối ưu hóa trình biên dịch phù hợp có hiệu lực, điều này sẽ nhanh hơn vẻ ngoài của nó.
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);
}