ปัญหาและวิธีเอาชนะใน C ++
ปัญหาที่เกิดขึ้นได้รับการอธิบายอย่างกว้างขวางโดยpatและแมตต์ โดยทั่วไปคอมไพเลอร์จะละเว้นมิติแรกของขนาดของอาร์เรย์อย่างมีประสิทธิภาพโดยไม่สนใจขนาดของอาร์กิวเมนต์ที่ส่งผ่าน
ในทางกลับกัน C ++ คุณสามารถเอาชนะข้อ จำกัด นี้ได้อย่างง่ายดายด้วยสองวิธี:
- ใช้การอ้างอิง
- โดยใช้
std::array
(ตั้งแต่ C ++ 11)
อ้างอิง
หากฟังก์ชันของคุณพยายามอ่านหรือแก้ไขอาร์เรย์ที่มีอยู่เท่านั้น (ไม่ได้คัดลอก) คุณสามารถใช้การอ้างอิงได้อย่างง่ายดาย
ตัวอย่างเช่นสมมติว่าคุณต้องการให้มีฟังก์ชั่นที่รีเซ็ตอาร์เรย์ของสิบต์int
s 0
ตั้งค่าองค์ประกอบทุก คุณสามารถทำได้อย่างง่ายดายโดยใช้ลายเซ็นฟังก์ชันต่อไปนี้:
void reset(int (&array)[10]) { ... }
ไม่เพียง แต่จะใช้งานได้ดีเท่านั้น แต่ยังบังคับใช้มิติของอาร์เรย์ด้วย
นอกจากนี้คุณยังสามารถใช้เทมเพลตเพื่อสร้างโค้ดด้านบนทั่วไปได้ :
template<class Type, std::size_t N>
void reset(Type (&array)[N])
และสุดท้ายคุณสามารถใช้ประโยชน์จากconst
ความถูกต้อง ลองพิจารณาฟังก์ชันที่พิมพ์อาร์เรย์ 10 องค์ประกอบ:
void show(const int (&array)[10]) { ... }
โดยใช้const
รอบคัดเลือกเราจะป้องกันไม่ให้มีการปรับเปลี่ยนไปได้
คลาสไลบรารีมาตรฐานสำหรับอาร์เรย์
หากคุณพิจารณาไวยากรณ์ข้างต้นทั้งน่าเกลียดและไม่จำเป็นอย่างที่ฉันทำเราสามารถโยนมันลงในกระป๋องและใช้std::array
แทน (ตั้งแต่ C ++ 11)
นี่คือรหัส refactored:
void reset(std::array<int, 10>& array) { ... }
void show(std::array<int, 10> const& array) { ... }
มันวิเศษไม่ใช่เหรอ? ไม่ต้องพูดถึงว่าเคล็ดลับรหัสทั่วไปที่ฉันเคยสอนคุณไปก่อนหน้านี้ยังใช้งานได้:
template<class Type, std::size_t N>
void reset(std::array<Type, N>& array)
template<class Type, std::size_t N>
void show(const std::array<Type, N>& array)
ไม่เพียงแค่นั้น แต่คุณจะได้รับสำเนาและย้ายความหมายได้ฟรี :)
void copy(std::array<Type, N> array) {
}
ดังนั้นสิ่งที่คุณรอ? ไปใช้std::array
.