คุณสามารถ 'เรียนรู้' ขนาดของอาร์เรย์โดยอัตโนมัติ:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
หวังว่าคุณสามารถเปลี่ยนอินเตอร์เฟสเป็น set_data ได้ มันยังคงยอมรับอาร์เรย์สไตล์ C เป็นอาร์กิวเมนต์แรก มันเพิ่งเกิดขึ้นที่จะใช้มันโดยการอ้างอิง
มันทำงานอย่างไร
[อัปเดต: ดูที่นี่สำหรับการอภิปรายที่ครอบคลุมมากขึ้นเกี่ยวกับการเรียนรู้ขนาด]
นี่เป็นวิธีแก้ปัญหาทั่วไปเพิ่มเติม:
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);
}
วิธีนี้ใช้งานได้เนื่องจากอาเรย์ถูกส่งผ่านเป็นการอ้างอิงไปยังอาเรย์ ใน C / C ++ คุณไม่สามารถผ่านอาร์เรย์เป็นฟังก์ชั่นแทนมันจะสลายตัวไปยังตัวชี้และคุณสูญเสียขนาด แต่ใน C ++ คุณสามารถส่งการอ้างอิงไปยังอาร์เรย์ได้
ผ่านอาร์เรย์โดยอ้างอิงต้องใช้ประเภทให้ตรงทั้งหมด ขนาดของอาร์เรย์เป็นส่วนหนึ่งของชนิด ซึ่งหมายความว่าเราสามารถใช้พารามิเตอร์เทมเพลต 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);
}