ด้วยการเปิดตัว GCC 4.8.0 เรามีคอมไพเลอร์ที่รองรับการหักค่าส่งคืนชนิดอัตโนมัติซึ่งเป็นส่วนหนึ่งของ C ++ 14 ด้วย-std=c++1y
ฉันสามารถทำสิ่งนี้:
auto foo() { //deduced to be int
return 5;
}
คำถามของฉันคือ: ฉันควรใช้คุณสมบัตินี้เมื่อใด เมื่อใดที่จำเป็นและเมื่อใดที่ต้องทำให้รหัสสะอาดขึ้น
สถานการณ์ 1
สถานการณ์แรกที่ฉันนึกได้คือเมื่อเป็นไปได้ ทุกฟังก์ชั่นที่สามารถเขียนด้วยวิธีนี้ควรจะเป็น ปัญหาเกี่ยวกับสิ่งนี้คือมันอาจไม่ทำให้โค้ดอ่านง่ายขึ้นเสมอไป
สถานการณ์ที่ 2
สถานการณ์ต่อไปคือการหลีกเลี่ยงประเภทการคืนที่ซับซ้อนมากขึ้น เป็นตัวอย่างที่เบามาก:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
ฉันไม่เชื่อว่าจะเป็นปัญหาจริง ๆ แต่ฉันคิดว่าการมีชนิดส่งคืนอย่างชัดเจนขึ้นอยู่กับพารามิเตอร์อาจชัดเจนในบางกรณี
สถานการณ์ 3
ถัดไปเพื่อป้องกันความซ้ำซ้อน:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
ใน C ++ 11 บางครั้งเราสามารถreturn {5, 6, 7};
แทนที่เวกเตอร์ได้ แต่นั่นไม่ได้ผลเสมอไปและเราจำเป็นต้องระบุประเภทในทั้งส่วนหัวของฟังก์ชั่นและส่วนของฟังก์ชั่น นี่คือการซ้ำซ้อนอย่างหมดจดและการลดชนิดการส่งคืนอัตโนมัติช่วยเราจากความซ้ำซ้อนนั้น
สถานการณ์ 4
ในที่สุดมันสามารถใช้แทนฟังก์ชั่นที่ง่ายมาก:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
แม้ว่าบางครั้งเราอาจดูที่ฟังก์ชั่นต้องการทราบประเภทที่แน่นอนและหากไม่ได้ระบุไว้เราต้องไปยังจุดอื่นในรหัสเช่นที่pos_
แจ้งไว้
ข้อสรุป
ด้วยสถานการณ์จำลองเหล่านั้นจริง ๆ ของพวกเขาพิสูจน์ให้เห็นว่าเป็นสถานการณ์ที่คุณสมบัตินี้มีประโยชน์ในการทำความสะอาดรหัส? สิ่งที่เกี่ยวกับสถานการณ์ที่ฉันได้ละเลยที่จะพูดถึงที่นี่? ฉันควรระวังอะไรก่อนใช้คุณสมบัตินี้เพื่อที่จะไม่กัดฉันในภายหลัง มีคุณสมบัติใหม่ที่จะนำมาสู่ตารางที่ไม่สามารถทำได้หรือไม่
โปรดทราบว่าคำถามหลายข้อนั้นมีไว้เพื่อช่วยในการค้นหามุมมองที่จะตอบคำถามนี้
->decltype(t+u)
ด้วยการหักอัตโนมัติจะฆ่า SFINAE