ฉันสงสัยเกี่ยวกับเรื่องนี้ ฉันกำลังพยายามเขียนคลาส C++ เพื่อทำให้วัตถุเป็นอนุกรม นั่นก็คือฉันมี
template<class T>
class PolymorphicSerializable {
...
};
ซึ่งสามารถสืบทอด CRTP จากรูทของลำดับชั้น polymorphic ที่สามารถซีเรียลไลซ์ได้ (นั่นคือ "T" จะกลายเป็นคลาสรูทนั้น) มันมีตัวแปรสมาชิก "คงที่" ที่เป็นแผนที่ของชื่อคลาสไปยังฟังก์ชันโรงงานหรือวัตถุฟังก์ชันที่สามารถสร้างอินสแตนซ์ใหม่ของคลาสที่ได้รับมาใดก็ตามที่ถูกบันทึกไว้ เมื่อทำการโหลด (ชื่อของคลาสจะถูกบันทึกพร้อมกับข้อมูล)
อย่างไรก็ตาม ปัญหาที่ฉันมีคือ แน่นอนว่าสมาชิกแบบคงที่นี้จะต้องเริ่มต้นได้ วิธีที่ฉันทำตอนนี้คือใช้มาโครเพื่อกรอกข้อมูลสำเร็จรูปนี้ อย่างไรก็ตาม ปัญหาคือในการเริ่มต้นสแตติกนั้น แน่นอนว่าเราต้องการพารามิเตอร์เทมเพลต และหาก "T" เป็น อินสแตนซ์เทมเพลต (เช่น คลาสรูทคืออินสแตนซ์เทมเพลต) ฉันพบปัญหาเช่นนี้
MACRO_FOR_INITIALIZING_STATIC_MEMBER(SomeClass<int, int>)
(ไม่ใช่ชื่อจริง) และตัวประมวลผลล่วงหน้า C ++ ไม่ชอบสิ่งนี้เนื่องจากเครื่องหมายจุลภาค วาง
MACRO_FOR_INITIALIZING_STATIC_MEMBER((SomeClass<int, int>))
ใช้งานไม่ได้เนื่องจากอาร์กิวเมนต์เทมเพลต (เช่น "T" ของ PolymorphicSerializable) ไม่สามารถอยู่ในวงเล็บได้ และเวอร์ชันที่อยู่ในวงเล็บนั้นคือสิ่งที่ลงเอยเป็นอาร์กิวเมนต์เทมเพลต
สิ่งที่สามารถทำได้เกี่ยวกับเรื่องนี้? จำเป็นต้องมีวิธีบางอย่างในการสรุปรายละเอียดการใช้งานของแผนที่คลาส แต่อย่างไร มีวิธีที่จะทำโดยไม่ใช้มาโครหรือไม่?
#define MACRO(...) doStuff(__VA_ARGS__)
- person N. Shead   schedule 23.07.2016