C++ static template with external implementation -


मेरे पास एक सरल रजिस्ट्री पैटर्न है:

  वर्ग ऑब्जेक्ट {// कुछ माध्यमिक सरल तरीकों}; #define OBJECT_DEF (नाम) \ public: \ static const char * नाम () {वापसी का नाम; } \ निजी: क्लास रजिस्ट्री {struct string_less {bool ऑपरेटर () (const std :: string और str1, const std :: string और str2) {for (int i = 0; i & lt; str1.size () & amp; amp; ; I & lt; str2.size (); ++ i) {यदि (str1 [i]! = Str2 [i]) वापसी str1 [i] & lt; str2 [i]; } वापसी str1.size () & lt; str2.size (); }}; Typedef बढ़ावा :: shared_ptr & lt; वस्तु & gt; ptrInterface; Typedef std :: नक्शा & lt; Std :: string, ptrInterface, string_less & gt; कंटेनर; कंटेनर रजिस्ट्री; स्थिर रजिस्ट्री _instance; PtrInterface खोज (std :: स्ट्रिंग नाम); संरक्षित: रजिस्ट्री () {} ~ रजिस्ट्री () {} सार्वजनिक: टेम्पलेट & lt; वर्ग टी & gt; स्थिर टी * प्राप्त करें (); // मैं इतना लिखना चाहता हूं !!! टेम्पलेट & lt; वर्ग टी & gt; स्थिर bool सेट (टी * उदाहरण, bool reSet = false); };  

और अगर मेरे पास एक ऐसा वर्ग है जो ऑब्जेक्ट को बढ़ाता है:

  class Foo: सार्वजनिक ऑब्जेक्ट {OBJECT_DEF ("foo"); // smth};  

मैं इस तरह से रजिस्ट्री का उपयोग करना चाहता हूं:

  रजिस्ट्री :: सेट (नया फू ());  

या

  रजिस्ट्री :: प्राप्त करें & lt; फ़ू & gt; ();  

मैं बाह्य कार्यान्वयन के साथ स्थिर टेम्पलेट कैसे अनुकरण कर सकता हूं?

मैं OBJECT_DEF () के साथ हैक का उपयोग नहीं करेगा

प्रत्येक वर्ग का एक अद्वितीय नाम है (कंपाइलर द्वारा परिभाषित) जो कि type_info के माध्यम से एक्सेस कर सकता है

तब मैं किसी ऑब्जेक्ट को बढ़ावा देने का उपयोग करूँगा इस जानकारी को नक्शे में अच्छी तरह से स्टोर करने के लिए।

मैंने इसे चेक नहीं किया है।
लेकिन रजिस्टर अब किसी भी प्रकार के साथ काम करना चाहिए।

  #include & lt; map & gt; #include & lt; boost / any.hpp & gt; #include & lt; typeinfo & gt; #include & lt; स्ट्रिंग & gt; # शामिल करें & lt; iostream & gt; क्लास रजिस्टर {static std :: map & lt; std :: string, boost :: any & gt; जानकारी; सार्वजनिक: // यदि आप केवल संकेतक संग्रहित करना चाहते हैं: // इनपुट पैरामीटर को सेट करने के लिए () सेट करने के लिए T * // बदलने के लिए (*) हो जाने के लिए T * हो और किसी भी_कास्ट को संशोधित करें। // // यदि आप बस पॉइंटर्स को संचित कर रहे हैं तो मैं मैप को संशोधित करने के लिए / भी बढ़ावा देगा: pointer_map ताकि स्वामित्व हस्तांतरित किया जा सके और मेमोरी साफ हो जाए। टेम्पलेट & lt; typename T & gt; स्थिर शून्य सेट (टी const और मूल्य) {डेटा [std :: string (टाइपिड (टी) .name ())] = boost :: कोई भी (मान); } टेम्पलेट & lt; typename T & gt; स्थिर टी प्राप्त करें () {रिटर्न बूस्ट :: किसी भी टैग & lt; T & gt; (डेटा [std :: string (typeid (T) .name ())]); }}; Std :: map & lt; std :: string, boost :: any & gt; रजिस्टर :: डेटा; Int main () {// वर्तमान में यह लाइन रिसाव होगी क्योंकि पंजीकरण स्वामित्व नहीं लेता है। रजिस्टर :: सेट (नया इंट (1)); // यह लाइन ठीक काम करता है रजिस्टर :: सेट (पूर्णांक (5)); Std :: cout & lt; & lt; * (पंजीकृत करें :: प्राप्त करें & lt; int * & gt; ()) & lt; & lt; "\ N"; Std :: cout & lt; & lt; पंजीकरण करें: & lt; int & gt; () & lt; & lt; "\ N"; }  

Comments

Popular posts from this blog

Eclipse CDT variable colors in editor -

AJAX doesn't send POST query -

wpf - Custom Message Box Advice -