คุณจะใช้การทำให้เป็นอนุกรมแบบห่อหุ้มใน C ++ โดยไม่มีมาโครได้อย่างไร

ฉันสงสัยเกี่ยวกับเรื่องนี้ ฉันกำลังพยายามเขียนคลาส 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) ไม่สามารถอยู่ในวงเล็บได้ และเวอร์ชันที่อยู่ในวงเล็บนั้นคือสิ่งที่ลงเอยเป็นอาร์กิวเมนต์เทมเพลต

สิ่งที่สามารถทำได้เกี่ยวกับเรื่องนี้? จำเป็นต้องมีวิธีบางอย่างในการสรุปรายละเอียดการใช้งานของแผนที่คลาส แต่อย่างไร มีวิธีที่จะทำโดยไม่ใช้มาโครหรือไม่?


person The_Sympathizer    schedule 23.07.2016    source แหล่งที่มา
comment
คุณอาจสนใจที่จะรู้เกี่ยวกับการมีอยู่ของ 'มาโครแปรผัน' (C ++ 11) ซึ่งอาจแก้ปัญหาเฉพาะนั้นได้: #define MACRO(...) doStuff(__VA_ARGS__)   -  person N. Shead    schedule 23.07.2016


คำตอบ (1)


นอกเหนือจากมาโครแบบแปรผัน ตามที่แนะนำโดยความคิดเห็นต่อคำถามของคุณ คุณสามารถรวมสมาชิกแบบคงที่ไว้ในฟังก์ชัน getter ได้ เนื่องจากจะลบข้อกำหนดในการจัดสรรพื้นที่สำหรับสมาชิกแบบคงที่แยกกัน:

template<class T>
class PolymorphicSerializable {
   typedef SomeType<T> StaticInstanceType;
   static StaticInstanceType& getContext() {
       static StaticInstanceType instance;
       return instance;
   }
};

และใช้ทะเยอทะยานนั้นทุกที่

person Dutow    schedule 23.07.2016