คำถามติดแท็ก sfinae

27
Templated ตรวจสอบการมีอยู่ของฟังก์ชันสมาชิกคลาสหรือไม่
เป็นไปได้ไหมที่จะเขียนเทมเพลตที่เปลี่ยนลักษณะการทำงานขึ้นอยู่กับว่าฟังก์ชั่นสมาชิกบางตัวมีการกำหนดไว้ในคลาสหรือไม่? นี่คือตัวอย่างง่ายๆของสิ่งที่ฉันต้องการเขียน: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return obj->toString(); else return "toString not defined"; } ดังนั้นหากclass TมีการtoString()กำหนดไว้แล้วมันจะใช้มัน มิฉะนั้นจะไม่ ส่วนมหัศจรรย์ที่ฉันไม่รู้ว่าต้องทำอย่างไรคือส่วน "FUNCTION_EXISTS"

28
ฉันจะเพิ่มการสะท้อนกลับไปยังแอปพลิเคชัน C ++ ได้อย่างไร
ฉันต้องการที่จะสามารถตรวจสอบคลาส C ++ สำหรับชื่อเนื้อหา (เช่นสมาชิกและประเภทของพวกเขา) ฯลฯ ฉันกำลังพูดภาษา C ++ ที่นี่ไม่ใช่จัดการ C ++ ซึ่งมีการสะท้อนกลับ ฉันรู้ว่า C ++ ให้ข้อมูลที่ จำกัด โดยใช้ RTTI ห้องสมุดเพิ่มเติมใด (หรือเทคนิคอื่น ๆ ) สามารถให้ข้อมูลนี้ได้บ้าง?

3
ทำไมฉันควรหลีกเลี่ยง std :: enable_if ในฟังก์ชันลายเซ็น
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; } }; เป็นพารามิเตอร์เทมเพลต: …

2
`void_t` ทำงานอย่างไร
ผมเฝ้าดูการพูดคุยวอลเตอร์บราวน์ที่ Cppcon14 เกี่ยวกับการเขียนโปรแกรมแม่แบบที่ทันสมัย ( Part I , Part II ) ที่เขานำเสนอของเขาvoid_tเทคนิค SFINAE ตัวอย่าง: กำหนดเทมเพลตตัวแปรแบบง่ายที่ประเมินvoidว่าถ้าอาร์กิวเมนต์เท็มเพลตทั้งหมดมีรูปแบบที่ดี: template< class ... > using void_t = void; และลักษณะต่อไปนี้ที่ตรวจสอบการมีอยู่ของตัวแปรสมาชิกที่เรียกว่าสมาชิก : template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class …
149 c++  templates  c++14  sfinae 

16
ตรวจสอบว่าคลาสมีฟังก์ชันสมาชิกของลายเซ็นที่กำหนดหรือไม่
ฉันกำลังขอเคล็ดลับเทมเพลตเพื่อตรวจสอบว่าชั้นเรียนมีฟังก์ชันสมาชิกเฉพาะของลายเซ็นที่กำหนดหรือไม่ ปัญหาคล้ายกับที่อ้างถึงที่นี่ http://www.gotw.ca/gotw/071.htm แต่ไม่เหมือนกัน: ในรายการหนังสือของซัตเทอร์เขาตอบคำถามที่คลาส C ต้องให้ฟังก์ชันสมาชิกด้วย ลายเซ็นเฉพาะมิฉะนั้นโปรแกรมจะไม่รวบรวม ในปัญหาของฉันฉันต้องทำอะไรบางอย่างถ้าคลาสมีฟังก์ชันนั้นให้ทำ "อย่างอื่น" ประสบปัญหาที่คล้ายกันโดย boost :: serialization แต่ฉันไม่ชอบวิธีแก้ปัญหาที่พวกเขานำมาใช้: ฟังก์ชันเทมเพลตที่เรียกใช้ฟังก์ชันฟรี (ที่คุณต้องกำหนด) โดยค่าเริ่มต้นด้วยลายเซ็นเฉพาะเว้นแต่คุณจะกำหนดฟังก์ชันสมาชิกเฉพาะ ( ในกรณีของพวกเขา "ทำให้เป็นอนุกรม" ที่ใช้พารามิเตอร์ 2 ตัวในประเภทที่กำหนด) โดยมีลายเซ็นเฉพาะมิฉะนั้นข้อผิดพลาดในการคอมไพล์จะเกิดขึ้น นั่นคือการใช้การทำให้เป็นอนุกรมทั้งแบบล่วงล้ำและไม่ล่วงล้ำ ฉันไม่ชอบวิธีแก้ปัญหานั้นด้วยเหตุผลสองประการ: เพื่อไม่ล่วงล้ำคุณต้องแทนที่ฟังก์ชัน "serialize" ทั่วโลกที่อยู่ใน boost :: serialization namespace ดังนั้นคุณจึงมีรหัสลูกค้าของคุณเพื่อเปิดการเพิ่มเนมสเปซและการทำให้เป็นอนุกรมเนมสเปซ! สแต็กเพื่อแก้ไขปัญหานั้นคือการเรียกใช้ฟังก์ชัน 10 ถึง 12 ฉันต้องการกำหนดพฤติกรรมที่กำหนดเองสำหรับคลาสที่ไม่มีฟังก์ชันสมาชิกนั้นและเอนทิตีของฉันอยู่ภายในเนมสเปซที่แตกต่างกัน (และฉันไม่ต้องการแทนที่ฟังก์ชันส่วนกลางที่กำหนดไว้ในเนมสเปซเดียวในขณะที่ฉันอยู่ในอีกอันหนึ่ง) คุณช่วยไขปริศนานี้ให้ฉันได้ไหม
135 c++  c++11  templates  sfinae 

9
ตัวอย่าง C ++ SFINAE?
ฉันต้องการเข้าสู่การเขียนโปรแกรมเมตาเทมเพลตเพิ่มเติม ฉันรู้ว่า SFINAE ย่อมาจาก "ความล้มเหลวในการทดแทนไม่ใช่ข้อผิดพลาด" แต่ใครช่วยบอกวิธีใช้ SFINAE ให้ฉันดูหน่อยได้ไหม

2
std :: is_function ใช้งานอย่างไร?
การดำเนินการต่อไปนี้เป็นstd::is_functionอย่างไร template<class T> struct is_function : std::integral_constant< bool, !std::is_const<const T>::value && !std::is_reference<T>::value > {}; (จากการอ้างอิง CPP ) ดูเหมือนว่าฉันintจะเป็นฟังก์ชั่นภายใต้คำจำกัดความนี้ ฉันกำลังคิดถึงอะไร
82 c++  templates  std  sfinae 

2
วิธีการทำงานของ SFINAE ใน C ++
ฉันใช้ฟังก์ชั่น SFINAE อย่างหนักในโครงการและไม่แน่ใจว่ามีความแตกต่างใด ๆ ระหว่างสองวิธีต่อไปนี้ (นอกเหนือจากสไตล์): #include <cstdlib> #include <type_traits> #include <iostream> template <class T, class = std::enable_if_t<std::is_same_v<T, int>>> void foo() { std::cout << "method 1" << std::endl; } template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0> void foo() { std::cout << "method 2" << std::endl; } int main() { foo<int>(); …
40 c++  sfinae 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.