ใน C ++ 11 มีไวยากรณ์สองแบบสำหรับการประกาศฟังก์ชัน:
return-type identifier (
การประกาศอาร์กิวเมนต์ ... )
และ
auto
ตัวระบุ (
การประกาศอาร์กิวเมนต์ ... )
->
return_type
พวกเขาเทียบเท่า ตอนนี้เมื่อเทียบเท่าแล้วทำไมคุณถึงต้องการใช้แบบหลัง? C ++ 11 แนะนำdecltype
สิ่งที่ยอดเยี่ยมนี้ซึ่งช่วยให้คุณสามารถอธิบายประเภทของนิพจน์ได้ ดังนั้นคุณอาจต้องการรับประเภทผลตอบแทนจากประเภทอาร์กิวเมนต์ ดังนั้นคุณลอง:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
และคอมไพเลอร์จะบอกคุณว่ามันไม่รู้a
และb
อยู่ในdecltype
อาร์กิวเมนต์ นั่นเป็นเพราะพวกเขาประกาศโดยรายการอาร์กิวเมนต์เท่านั้น
คุณสามารถแก้ไขปัญหาได้อย่างง่ายดายโดยใช้declval
และพารามิเตอร์เทมเพลตที่ประกาศไว้แล้ว ชอบ:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
ยกเว้นตอนนี้มันดูละเอียดขึ้นจริงๆ ดังนั้นจึงมีการเสนอและใช้ไวยากรณ์การประกาศทางเลือกและตอนนี้คุณสามารถเขียนได้แล้ว
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
และมันละเอียดน้อยลงและกฎการกำหนดขอบเขตก็ไม่จำเป็นต้องเปลี่ยนแปลง
การอัปเดต C ++ 14: C ++ 14 อนุญาตเพียงแค่
auto
การประกาศอาร์กิวเมนต์ตัวระบุ(
... )
ตราบเท่าที่ฟังก์ชั่นถูกกำหนดไว้อย่างสมบูรณ์ก่อนการใช้งานและreturn
คำสั่งทั้งหมดอนุมานเป็นประเภทเดียวกัน ->
ไวยากรณ์ยังคงมีประโยชน์สำหรับฟังก์ชั่นของประชาชน (ประกาศในส่วนหัว) ถ้าคุณต้องการที่จะซ่อนร่างกายในแฟ้มแหล่งที่มา เห็นได้ชัดว่าไม่สามารถทำได้ด้วยเทมเพลต แต่มีบางประเภทที่เป็นรูปธรรม (โดยปกติจะได้มาจากการเขียนโปรแกรมแม่แบบ) ที่ยากที่จะเขียนเป็นอย่างอื่น