สมมติว่าเรามีโครงสร้างสำหรับการถือครอง 3 คู่พร้อมฟังก์ชันสมาชิกบางอย่าง:
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
นี่เป็นเพียงเล็กน้อยที่ออกแบบมาเพื่อความเรียบง่าย แต่ฉันแน่ใจว่าคุณยอมรับว่ามีรหัสที่คล้ายกันอยู่ที่นั่น วิธีการนี้ช่วยให้คุณเชื่อมโยงได้อย่างสะดวกตัวอย่างเช่น:
Vector v = ...;
v.normalize().negate();
หรือแม้กระทั่ง:
Vector v = Vector{1., 2., 3.}.normalize().negate();
ตอนนี้ถ้าเราให้ฟังก์ชั่นเริ่มต้น () และ end () เราสามารถใช้เวกเตอร์ของเราในรูปแบบใหม่สำหรับการวนซ้ำโดยพูดว่าจะวนรอบพิกัด 3 x, y และ z (คุณไม่ต้องสงสัยเลยว่าสร้างตัวอย่างที่ "มีประโยชน์" มากขึ้น โดยการแทนที่ Vector ด้วยเช่น String):
Vector v = ...;
for (double x : v) { ... }
เราสามารถทำได้:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
และนอกจากนี้ยังมี:
for (double x : Vector{1., 2., 3.}) { ... }
อย่างไรก็ตามสิ่งต่อไปนี้ (ดูเหมือนสำหรับฉัน) เสีย:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
ในขณะที่ดูเหมือนเป็นการรวมกันอย่างมีเหตุผลของสองการใช้งานก่อนหน้านี้ แต่ฉันคิดว่าการใช้งานครั้งล่าสุดนี้สร้างการอ้างอิงที่ห้อยลงในขณะที่สองอย่างก่อนหน้านั้นใช้ได้อย่างสมบูรณ์
- สิ่งนี้ถูกต้องและเป็นที่ชื่นชมอย่างกว้างขวางหรือไม่?
- ส่วนไหนของข้างต้นเป็นส่วนที่ "ไม่ดี" ที่ควรหลีกเลี่ยง?
- ภาษาจะได้รับการปรับปรุงโดยการเปลี่ยนนิยามของ range-based for loop เช่นที่ temporaries ที่สร้างใน for-expression มีอยู่ตลอดระยะเวลาของลูปหรือไม่