मान लें कि मुझे टेम्पलेट, टी 1 और टी 2 में दो तर्क प्राप्त हैं। अगर मुझे पता है कि टी 1 स्वयं ही एक टेम्पलेटेड क्लास (उदाहरण के लिए, एक कंटेनर) है, और टी 2 कुछ भी हो सकता है, तो क्या मेरे लिए टी 1 के लिए बेस टेम्पलेट प्रकार निर्धारित करना संभव है और टी 2 का उपयोग करके इसे तर्क के रूप में पुनर्निर्माण करना संभव है?क्या सी ++ में अपने तर्कों से टेम्पलेट को विचलित करना संभव है?
उदाहरण के लिए, यदि मुझे std::vector<int>
और std::string
प्राप्त होता है, तो मैं स्वचालित रूप से std::vector<std::string>
बनाना चाहता हूं। हालांकि अगर मुझे std::set<bool>
और double
दिया गया था, तो यह std::set<double>
का उत्पादन करेगा।
टाइप_ट्रेट, प्रासंगिक ब्लॉग और अन्य प्रश्नों की समीक्षा करने के बाद, मुझे इस समस्या को हल करने के लिए एक सामान्य दृष्टिकोण नहीं दिख रहा है। इस कार्य को पूरा करने के लिए वर्तमान में एकमात्र तरीका यह है कि प्रत्येक प्रकार के लिए टेम्पलेट एडेप्टर बनाना है जिसे टी 1 के रूप में पारित किया जा सकता है।
उदाहरण के लिए, अगर मैं था:
template<typename T_inner, typename T_new>
std::list<T_new> AdaptTemplate(std::list<T_inner>, T_new);
template<typename T_inner, typename T_new>
std::set<T_new> AdaptTemplate(std::set<T_inner>, T_new);
template<typename T_inner, typename T_new>
std::vector<T_new> AdaptTemplate(std::vector<T_inner>, T_new);
मैं decltype का उपयोग करें और अपनी समस्या को हल करने के अधिक भार ऑपरेटर पर भरोसा करने में सक्षम होना चाहिए। कुछ के साथ कुछ:
template <typename T1, typename T2>
void MyTemplatedFunction() {
using my_type = decltype(AdaptTemplate(T1(),T2()));
}
क्या मुझे कुछ याद आ रही है? क्या कोई बेहतर दृष्टिकोण है?
मैं ऐसा क्यों करना चाहता हूं?
मैं एक सी ++ लाइब्रेरी का निर्माण कर रहा हूं जहां मैं सरल बनाना चाहता हूं कि मॉड्यूलर टेम्पलेट्स बनाने के लिए उपयोगकर्ताओं को क्या करना है। उदाहरण के लिए, यदि कोई उपयोगकर्ता एजेंट-आधारित सिमुलेशन बनाना चाहता है, तो वे एक विश्व टेम्पलेट को जीव प्रकार, जनसंख्या प्रबंधक, पर्यावरण प्रबंधक और एक व्यवस्थित प्रबंधक के साथ कॉन्फ़िगर कर सकते हैं।
World< NeuralNetworkAgent, EAPop<NeuralNetworkAgent>,
MazeEnvironment<NeuralNetworkAgent>,
LineageTracker<NeuralNetworkAgent> > world;
मैं बहुत चाहते बल्कि उन NeuralNetworkAgent
हर बार दोहराना नहीं:
प्रत्येक भी जीव प्रकार पता करने के लिए है, तो एक घोषणा कुछ कैसा लग सकता है की जरूरत है। अगर मैं टेम्पलेट तर्क को बदलने में सक्षम हूं, तो डिफ़ॉल्ट तर्क का इस्तेमाल किया जा सकता है और इसके बाद के संस्करण के लिए सरल किया जा सकता:
World< NeuralNetworkAgent, EAPop<>, MazeEnvironment<>, LineageTracker<> > world;
साथ ही यह प्रकार त्रुटियों के बारे में चिंता किए बिना एक से दूसरे विश्व प्रकार से परिवर्तित करने के लिए आसान है।
बेशक, मैं static_assert का उपयोग करके अधिकांश त्रुटियों से निपट सकता हूं और केवल लंबी घोषणाओं से निपट सकता हूं, लेकिन मैं जानना चाहता हूं कि एक बेहतर समाधान संभव है या नहीं।
मुझे मिले सभी तीन उत्तरों उत्कृष्ट थे। @ बैरी द्वारा एक सबसे गहन है और टीसी द्वारा एक है। मेरी अंतर्निहित समस्या को सबसे अच्छा हल करता है, लेकिन मुझे लगता है कि सैम वरशाविक (जिसे मैंने स्वीकार किया) की प्रतिक्रिया प्रश्न को हल करने के लिए सबसे खूबसूरत है जैसा मैंने पूछा था। सभी को बहुत बहुत धन्यवाद! –
इस पोस्ट के लिए एक डुप्लिकेट होने के नाते, मुझे लगता है कि @ बेन वोइट द्वारा इंगित किया गया एक बहुत ही समान है, लेकिन विशेष रूप से एसटीएल पर ध्यान केंद्रित करता है। यदि प्रश्न में सभी टेम्पलेट्स एक ही लाइब्रेरी से आते हैं, तो निश्चित रूप से अतिरिक्त चालें संभव हो सकती हैं। उस ने कहा, दूसरे प्रश्न में कुछ दिलचस्प और उपयोगी उत्तर भी हैं। उस ने कहा, मुझे यहां दिए गए उत्तरों को इस प्रश्न के लिए अधिक लक्षित किया गया है और अधिक तत्काल उपयोगी है। –
हालांकि दूसरा प्रश्न कम व्यापक है, उत्तर आपके मामले को पूरी तरह से कवर करते हैं। यही कारण है कि मेरा झंडा एक बैनर में कहता है कि "आपके प्रश्न का जवाब यहां पहले से है"। –