मैं एक सी ++ टेम्पलेट विशेषज्ञता को परिभाषित करना चाहता हूं जो किसी दिए गए बेस क्लास के सभी उप-वर्गों पर लागू होता है। क्या यह संभव है?सभी उप-वर्गों के लिए टेम्पलेट विशेषज्ञता
विशेष रूप से, मैं इसे एसटीएल के हैश <> के लिए करना चाहता हूं। हैश <> एक खाली parametrized टेम्पलेट के रूप में परिभाषित किया गया है, और विशेष प्रकार के लिए विशेषज्ञता के एक परिवार:
template<class _Key>
struct hash { };
template<>
struct hash<char>
{
size_t
operator()(char __x) const
{ return __x; }
};
template<>
struct hash<int>
{
size_t
operator()(int __x) const
{ return __x; }
};
...
मैं कुछ इस तरह परिभाषित करना चाहते हैं:
template<class Base>
struct hash {
size_t operator()(const Base& b) const {
return b.my_hash();
}
};
class Sub : public Base {
public:
size_t my_hash() const { ... }
};
और की तरह उपयोग करने में सक्षम हो इस:
hash_multiset<Sub> set_of_sub;
set_of_sub.insert(sub);
हालांकि, एसटीएल से सामान्य से एक के साथ मेरी हैश टेम्पलेट विरोध करता है। क्या किसी टेम्पलेट विशेषज्ञता को परिभाषित करने के लिए कोई तरीका है (शायद लक्षणों का उपयोग करना) जो किसी दिए गए बेस क्लास के सभी उप-वर्गों पर लागू होता है (एसटीएल परिभाषाओं को संशोधित किए बिना)?
नोट मुझे पता है कि मैं कुछ अतिरिक्त टेम्प्लेट पैरामीटर जब भी इस हैश विशेषज्ञता की जरूरत है साथ ऐसा कर सकते हैं, लेकिन मैं चाहता हूँ इस से बचने के लिए यदि संभव हो तो:
template<>
struct hash<Base> {
size_t operator()(const Base& b) const {
return b.my_hash();
}
};
....
// similar specialization of equal_to is needed here... I'm glossing over that...
hash_multiset<Sub, hash<Base>, equal_to<Base> > set_of_sub;
set_of_sub.insert(sub);
यदि यह विरोधाभासी क्यों नामस्थान का उपयोग नहीं करता है? – Arunmu
http://stackoverflow.com/questions/1032973/how-to-partially-specialize-a-class-template-for-all-derived-types –
का एक संभावित डुप्लिकेट ... जहां समाधान सभी का नाम है व्युत्पन्न कक्षाएं इसी तरह से, जो काफी संतोषजनक नहीं है। – jpalecek