दिलचस्प पोस्ट
इम्यूलेटर: त्रुटि: x86 इम्यूलेशन वर्तमान में हार्डवेयर त्वरण की आवश्यकता है सभी ब्राउज़रों के लिए Object.watch ()? उपवर्ग वस्तु जावा को प्रारंभ करने के लिए सुपर क्लास का उपयोग करना LINQ के साथ क्रम कायम रखना मैं अपने आवेदन की मूल प्रक्रिया के पीआईडी ​​कैसे प्राप्त कर सकता हूं स्विफ्ट का उपयोग करते हुए अपेक्षित घोषणा त्रुटि गलत आकार लौटाते हुए यूएसस्क्रीन मेनस्क्रीन बाउंड java: (स्ट्रिंग ) List.toArray () ClassCastException प्रदान करता है फाइलों में खोजें: टीम फाउंडेशन सर्वर में सभी कोड खोजें जैक्सन JSON के साथ किसी स्ट्रिंग, स्ट्रिंग> को JSON स्ट्रिंग को मैप में कनवर्ट कैसे करें लूप में बनाए गए jQuery इवेंट हैंडलर कोणीय एचटीटीपीएक्वाइंट हेडर नहीं भेजता है एंड्रॉइड स्टूडियो लेआउट पूर्वावलोकन कहां है? Object_id असाइनमेंट कैसे काम करता है? मैं git commit संदेश में डिफ़ॉल्ट टिप्पणियों को कैसे बदल सकता हूँ?

संकलन के समय में इमारतें और प्रकारों की सूची तक पहुंचने

मैं c ++ टेम्पलेट मेटाप्रोग्राममिंग का उपयोग करके निम्नलिखित को प्राप्त करने की कोशिश कर रहा हूं। मैं एक प्रकार की सूची तैयार करना चाहता हूं और फिर इन प्रकारों को एक साथ एकत्रित करना चाहता हूं और सूची में आगे संकलन समय प्रसंस्करण करना चाहता हूं। उदाहरण के लिए:

foo.h:

class Foo { ... }; // INSERT ANY CODE HERE 

bar.h:

 class Bar { ... }; // INSERT ANY CODE HERE 

main.h:

 #include "foo.h" #include "bar.h" struct list_of_types { typedef /* INSERT ANY CODE HERE */ type; }; 

मैं ऊपर दिए गए स्लॉट्स में किसी भी कोड को सम्मिलित कर सकता हूं, जब तक list_of_types :: type फू और बार प्रकार वाली सूची के कुछ प्रतिनिधित्व (जैसे एक बढ़ावा :: एमप्ल :: वेक्टर) को हल करता है निम्नलिखित प्रतिबंध लागू होते हैं:

  1. Foo.h में कोड को bar.h में कोड के बारे में नहीं पता होना चाहिए, और इसके विपरीत। # Main.h में निर्देशों को शामिल करने का आदेश बदलना संभव है और किसी भी अन्य कोड को परिवर्तित नहीं करना चाहिए।

  2. Main.h में कोड बदलने के लिए नहीं होना चाहिए अगर मैं सूची में और प्रकार जोड़ने के लिए आगे के हेडर शामिल करें।

  3. संकलित समय पर प्रकार की सूची उपलब्ध होनी चाहिए। मैं सूची में शामिल होने वाले और मेटाप्रोग्रामिंग करने की योजना बना रहा हूं I

Solutions Collecting From Web of "संकलन के समय में इमारतें और प्रकारों की सूची तक पहुंचने"

सामान्य हेडर, वैराडीक टेम्पलेट्स और मैक्रो का उपयोग करने वाला समाधान:

 // Header common.h // A distinct Void type struct Void {}; template <typename ...> struct concat; template <template <typename ...> class List, typename T> struct concat<List<Void>, T> { typedef List<T> type; }; template <template <typename ...> class List, typename ...Types, typename T> struct concat<List<Types...>, T> { typedef List<Types..., T> type; }; template <typename...> struct TypeList {}; template <> struct TypeList<Void> {}; typedef TypeList<Void> TypelistVoid; #define TYPE_LIST TypelistVoid // Header foo.h // #include <common.h> class Foo { }; typedef typename concat<TYPE_LIST, Foo>::type TypeListFoo; #undef TYPE_LIST #define TYPE_LIST TypeListFoo // Header bar.h // #include <common.h> class Bar { }; typedef typename concat<TYPE_LIST, Bar>::type TypeListBar; #undef TYPE_LIST #define TYPE_LIST TypeListBar // Header main.h // #include "foo.h" // #include "bar.h" struct list_of_types { typedef TYPE_LIST type; }; // Or just typedef TYPE_LIST list_of_types; // Test #include <iostream> #include <typeinfo> template <template <typename ...> class List, typename T, typename ...Types> void info(); template <typename T, typename ...Types> inline void info(TypeList<T, Types...>) { std::cout << typeid(T).name() << std::endl; info(TypeList<Types...>()); } template <typename T> inline void info(TypeList<T>) { std::cout << typeid(T).name() << std::endl; } int main() { info(list_of_types::type()); return 0; }