c++ - Linking to dynamically available functions at compile time -
मान लीजिए मेरे पास निम्न मुख्य वर्ग है:
class कोर {सार्वजनिक: टेम्पलेट & lt; typename टी & gt; शून्य स्वीकार (टी ऑब्जेक्ट); } अब मैं इस तरह से तरीके लिखने में सक्षम होना चाहता हूँ:
शून्य हैंडल (int par); और कहीं भी लिंक / संकलन चरण के दौरान उन्हें पंजीकृत करें और कोर में कुछ टाइपनाम के लिए पंजीकृत सही विधि को कॉल करें स्वीकार करें (टी) विधि उदाहरण के लिए Core.accept (5) को 5 से हैंडल (इंट) फ़ंक्शन को किसी तरह पंजीकृत होने के बाद हाथ में डाल दिया जाता है। ऐसा कुछ (संगत उदाहरण नहीं): टेम्पलेट & lt; typename T & gt; शून्य कोर :: स्वीकार (टी बराबर) {// constexpr std :: map & lt; std :: type_info, फ़ंक्शन & gt; type_func_mapping; स्वतः इसे = टाइप_फंसी_मैपिंग.गेट (टाइपिड (टी)); // स्थिर होना चाहिए static_assert (यह! = Type_func_mapping.end), "टाइप नाम के लिए कोई हेन्डलर नहीं मिला" + टाइपिड (टी) .name ()) ऑटो फंक्शन = * यह; // भी constexpr समारोह (बराबर); } क्या इस दृष्टिकोण के साथ कोई समस्या है / बेहतर है?
नोट: मैं एक तरह से कक्षा कोर के स्रोतों को निकालने में सक्षम होना चाहता हूं कि मैं उन्हें केवल पढ़ने के लिए हेडर / स्रोत फ़ाइल में संग्रहीत कर सकता हूं और उन्हें फिर से छूने की ज़रूरत नहीं है।
आप पंजीकृत फ़ंक्शन को स्टोर करने के लिए कार्य करने के लिए सूचक का उपयोग कर सकते हैं।
स्थिर शून्य (* reg_func) (args); स्थिर शून्य रजिस्टर (शून्य (* func) (आर्ग्स)) {reg_func = func; } // पंजीकरण भाग रजिस्टर (हैंडल); // फ़ंक्शन कॉल स्वीकार करते हैं, उपयोग में कुछ विवेक जांच का भी उपयोग कर सकते हैं reg_func (5 या जो भी हो) इसके साथ आपको अपने मुख्य वर्ग या यहां तक कि कोर वाले फ़ाइल को छूने की ज़रूरत नहीं है कक्षा। आप किसी अन्य फ़ाइल में संभाल फ़ंक्शन को परिभाषित कर सकते हैं, लेकिन हैंडल फ़ंक्शन के दृश्यता मोड का ध्यान रख सकते हैं। आपका संभाल फ़ंक्शन स्वयं पंजीकृत होगा और तब स्वीकार करेगा जो पंजीकृत फ़ंक्शन को कॉल कर सकता है।
Comments
Post a Comment