हाँ, आप कर सकते हैं। लेकिन आपको कॉल स्ट्रक्चर को बदलने की आवश्यकता होगी, लेकिन थोड़ी सी।
विशेष रूप से, सदस्य फ़ंक्शन के कार्यान्वयन को एक वर्ग के रूप में कार्यान्वित करने के लिए रणनीति पैटर्न का उपयोग करें (जिसे विशेषीकृत करने की अनुमति है)।
यह तब तक अनुमति है जब तक कि रणनीति वर्ग को नेस्टेड नहीं किया जाता है (और इसलिए अनन्य टेम्पलेट प्रकार पर निर्भर नहीं है)।
उदा। (यह शायद वाक्य रचना सही नहीं है, लेकिन यह विचार स्पष्ट किया जाना चाहिए)
template <class T>
class OuterThingThatIsNotSpecialized
{
template <class U>
void memberWeWantToSpecialize(const U& someObj_)
{
SpecializedStrategy<U>::doStuff(someObj_);
}
};
template <class U>
struct SpecializedStrategy;
template <>
SpecializedStrategy<int>
{
void doStuff(const int&)
{
// int impl
}
};
template <>
SpecializedStrategy<SomeOtherType>
{
void doStuff(const SomeOtherType&)
{
// SOT impl
}
};
यह अविश्वसनीय रूप से उपयोगी है क्योंकि प्रकार के लिए OuterThingThatIsNotSpecialized के लिए कॉल जहां कोई कार्यान्वयन मौजूद है बस असफल हो जायेगी संकलित करने के लिए है।
पीएस। आप इस रणनीति का आंशिक रूप से टेम्पलेट कार्यों को विशेषज्ञ बनाने के लिए भी उपयोग कर सकते हैं, जो कि अन्यथा सी ++ असंभवता है।
स्रोत
2009-02-21 18:35:49
निराशाजनक। संदर्भ के लिए धन्यवाद, यद्यपि! –
आईएसओ 14882: 1 99 8 धारा 14.7.3, अनुच्छेद 16 वह है जो इस स्थिति का वर्णन करता है। – greyfade