दिलचस्प पोस्ट
एमएसवीसी ++ वैराइडी मैक्रो विस्तार आईओएस 6: मैं कुछ दृश्यों को चित्रित करने और दूसरों को घुमाने के लिए कैसे रोकूं? एक सूचीबॉक्स में एक टेक्स्टबॉक्स आइटम का चयन करना सूचीबद्दी के चयनित आइटम को परिवर्तित नहीं करता है पीडीओ तैयार बयान – पैरामीटर के नामों में बृहदान्त्र के लिए क्या प्रयोग किया जाता है? MySQL में "नंबर टेबल" बनाना एक एएसपी.नेट वेबसाइट से एसएमएस भेजा जा रहा है एक 'foreach' लूप में एक सूची को संशोधित करने का सबसे अच्छा तरीका क्या है? गोलंग में दिनांक स्ट्रिंग पार्सिंग डेक्स निष्पादित करने में असमर्थ: जीसी ओवरहेड की सीमा एक्लिप्स में पार हो गई है 1 डी सरणी पर एक 2 डी सरणी को मैप करें PHP संकलित या व्याख्या की गई है? विकल्प पाठ का स्टाइलिंग भाग कैसे सी # में बहुआयामी (2 डी) सरणी का आकार बदलना है? एक varchar डेटा प्रकार का एक datetime डेटा प्रकार का रूपांतरण एक आउट-ऑफ-रेंज मान के रूप में हुआ मेरे आवेदन और एक्सेस क्वेरी विज़ार्ड के बीच भिन्न तरह के व्यवहार

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

मैं 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

वेब के समाधान से एकत्रित समाधान "संकलन के समय में इमारतें और प्रकारों की सूची तक पहुंचने"

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

 // 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; }