Scott Meyers โพสต์เนื้อหาและสถานะของหนังสือเล่มต่อไปของเขา EC ++ 11 เขาเขียนว่าหนึ่งรายการในหนังสือเล่มนี้อาจจะ"หลีกเลี่ยงการstd::enable_if
อยู่ในลายเซ็นฟังก์ชั่น"
std::enable_if
สามารถใช้เป็นอาร์กิวเมนต์ฟังก์ชั่นเป็นประเภทผลตอบแทนหรือเป็นแม่แบบชั้นเรียนหรือพารามิเตอร์แม่แบบฟังก์ชั่นเพื่อลบฟังก์ชั่นหรือคลาสจากเงื่อนไขการแก้ไขเกินพิกัด
ในคำถามนี้จะแสดงคำตอบทั้งสาม
พารามิเตอร์ฟังก์ชั่น:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
เป็นพารามิเตอร์เทมเพลต:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
ในฐานะที่เป็นประเภทผลตอบแทน:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- โซลูชันใดควรเป็นที่ต้องการและทำไมฉันจึงควรหลีกเลี่ยงผู้อื่น
- ในกรณีใด"หลีกเลี่ยง
std::enable_if
ในฟังก์ชั่นลายเซ็น"เกี่ยวข้องกับการใช้งานเป็นชนิดส่งคืน (ซึ่งไม่ได้เป็นส่วนหนึ่งของลายเซ็นฟังก์ชั่นปกติ แต่ของความเชี่ยวชาญแม่แบบ)? - มีความแตกต่างสำหรับแม่แบบฟังก์ชันสมาชิกและไม่ใช่สมาชิกหรือไม่?
std::enable_if
ที่จะถ่วงลายเซ็นฟังก์ชั่นของฉัน (โดยเฉพาะอย่างยิ่งน่าเกลียดเพิ่มเติมnullptr
รุ่นอาร์กิวเมนต์ฟังก์ชั่น) เพราะมันก็ดูเหมือนว่ามันคืออะไรสับแปลก (สำหรับบางสิ่งบางอย่างstatic if
อาจ ทำสิ่งที่สวยงามและสะอาดยิ่งขึ้น) โดยใช้เทมเพลตมนต์ดำเพื่อใช้ประโยชน์จากคุณสมบัติด้านภาษา นี่คือเหตุผลที่ฉันชอบการแจกจ่ายแท็กเมื่อใดก็ตามที่เป็นไปได้ (ดีคุณยังคงมีข้อโต้แย้งแปลก ๆ เพิ่มเติม แต่ไม่ได้อยู่ในส่วนต่อประสานสาธารณะและน่าเกลียดและซ่อนเร้นน้อยกว่า)
=0
ในการtypename std::enable_if<std::is_same<U, int>::value, int>::type = 0
ประสบความสำเร็จ? ฉันไม่พบแหล่งข้อมูลที่ถูกต้องเพื่อทำความเข้าใจ ฉันรู้ว่าส่วนแรกก่อน=0
มีประเภทสมาชิกint
ถ้าU
และint
เหมือนกัน ขอบคุณมาก!