यह थोड़ा OT है, लेकिन मुझे लगा कि मैं इसे यहाँ छोड़ दूँगा अगर यह किसी और की मदद करे। मैं टेम्प्लेट स्पेशलाइज़ेशन के बारे में गुगली कर रहा था, जिसने मुझे यहाँ तक पहुँचाया, और जबकि @ maxim1000 का उत्तर सही है और अंततः मुझे अपनी समस्याओं का पता लगाने में मदद मिली, मुझे नहीं लगा कि यह बहुतायत से स्पष्ट था।
ओपी की तुलना में मेरी स्थिति थोड़ी अलग है (लेकिन इस जवाब को मैं जितना सोचता हूं, उसे छोड़ देता हूं)। मूल रूप से, मैं सभी प्रकार के वर्गों के साथ एक तीसरे पक्ष के पुस्तकालय का उपयोग कर रहा हूं जो "स्थिति प्रकार" को परिभाषित करता है। इन प्रकारों का दिल बस enum
एस है, लेकिन सभी वर्ग एक सामान्य (अमूर्त) माता-पिता से विरासत में मिलते हैं और विभिन्न उपयोगिता कार्य प्रदान करते हैं, जैसे कि ऑपरेटर ओवरलोडिंग और एक static toString(enum type)
फ़ंक्शन। प्रत्येक स्थिति enum
एक दूसरे से अलग और असंबंधित है। उदाहरण के लिए, एक के enum
पास खेत हैं NORMAL, DEGRADED, INOPERABLE
, दूसरे के पास कक्षाएं हैं, लेकिन जब से वे अमूर्त हैं मैं उन्हें सीधे नहीं कर सकता। मैं प्रत्येक वर्ग को विस्तारित कर सकता था जिसे मैं उपयोग करना चाहता था, लेकिन अंततः मैंने एक वर्ग बनाने का फैसला किया , जहां कुछ भी ठोस स्थिति होगीAVAILBLE, PENDING, MISSING
आदि हैं। मेरा सॉफ्टवेयर विभिन्न घटकों के लिए विभिन्न प्रकार की स्थितियों के प्रबंधन का प्रभारी है। इसके बारे में यह आया कि मैं toString
इन कार्यों के लिए उपयोग करना चाहता थाenum
template
typename
enum
मैंने परवाह की। संभवतः उस निर्णय के बारे में कुछ बहस हो सकती है, लेकिन मुझे ऐसा लगा कि प्रत्येक अमूर्त enum
वर्ग को अपने स्वयं के एक कस्टम के साथ बढ़ाने और अमूर्त कार्यों को लागू करने की तुलना में बहुत कम काम था । और निश्चित रूप से मेरे कोड में, मैं बस कॉल करने में सक्षम होना चाहता था .toString(enum type)
और क्या यह उस के स्ट्रिंग प्रतिनिधित्व को प्रिंटenum
। चूंकि सभी enum
एस पूरी तरह से असंबंधित थे, इसलिए उनमें से प्रत्येक का अपना थाtoString
फ़ंक्शंस जो (कुछ शोध के बाद मैंने सीखा) को टेम्प्लेट विशेषज्ञता का उपयोग करके बुलाया जाना था। यही मुझे यहां ले गया। नीचे एक MCVE है कि इस काम को सही ढंग से करने के लिए मुझे क्या करना था। और वास्तव में मेरा समाधान @ maxim1000 की तुलना में थोड़ा अलग था।
यह s के लिए एक (बहुत सरलीकृत) हेडर फ़ाइल है enum
। वास्तव में, प्रत्येक enum
वर्ग को अपनी फ़ाइल में परिभाषित किया गया था। यह फ़ाइल उन हेडर फ़ाइलों का प्रतिनिधित्व करती है जो मुझे उस पुस्तकालय के भाग के रूप में प्रदान की जाती हैं जिसका मैं उपयोग कर रहा हूँ:
#include <string>
class Enum1
{
public:
enum EnumerationItem
{
BEARS1,
BEARS2,
BEARS3
};
static std::string toString(EnumerationItem e)
{
}
};
class Enum2
{
public:
enum EnumerationItem
{
TIGERS1,
TIGERS2,
TIGERS3
};
static std::string toString(EnumerationItem e)
{
}
};
अगली पंक्ति को एक अलग कोड ब्लॉक में अलग करने के लिए इस लाइन को जोड़ना:
#include <string>
template <typename T>
class TemplateExample
{
public:
TemplateExample(T t);
virtual ~TemplateExample();
std::string toString();
private:
T type_;
};
template <typename T>
TemplateExample<T>::TemplateExample(T t)
: type_(t)
{
}
template <typename T>
TemplateExample<T>::~TemplateExample()
{
}
अगली फ़ाइल
#include <string>
#include "enums.h"
#include "TemplateExample.h"
template <>
std::string TemplateExample<Enum1::EnumerationItem>::toString()
{
return Enum1::toString(type_);
}
template <>
std::string TemplateExample<Enum2::EnumerationItem>::toString()
{
return Enum2::toString(type_);
}
अगली फ़ाइल
#include <iostream>
#include "TemplateExample.h"
#include "enums.h"
int main()
{
TemplateExample<Enum1::EnumerationItem> t1(Enum1::EnumerationItem::BEARS1);
TemplateExample<Enum2::EnumerationItem> t2(Enum2::EnumerationItem::TIGERS3);
std::cout << t1.toString() << std::endl;
std::cout << t2.toString() << std::endl;
return 0;
}
और यह आउटपुट:
BEARS1
TIGERS3
कोई सुराग नहीं अगर यह मेरी समस्या को हल करने के लिए आदर्श समाधान है, लेकिन यह मेरे लिए काम करता है। अब, कोई फर्क नहीं पड़ता कि मैं कितने एन्यूमरेशन प्रकारों का उपयोग कर रहा हूं, मुझे केवल इतना करना है toString
कि .cpp फ़ाइल में विधि के लिए कुछ पंक्तियाँ जोड़नी हैं , और मैं पुस्तकालयों को पहले से परिभाषित toString
विधि का उपयोग कर सकता हूं बिना इसे लागू किए और प्रत्येक का विस्तार किए बिना। enum
कक्षा मैं उपयोग करना चाहते हैं।