C में, SFINAE (प्रतिस्थापन विफलता एक त्रुटि नहीं है) आपको इसकी अनुमति देता है टेम्प्लेट तर्क के प्रकार के आधार पर कोड को सक्षम या अक्षम करें। हालाँकि, क्लास टेम्पलेट के सदस्य कार्यों के साथ व्यवहार करते समय, SFINAE अक्सर अपेक्षा के अनुरूप काम नहीं करता है।
यहां एक उदाहरण है जो समस्या को प्रदर्शित करता है:
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
इस उदाहरण में, फू दो अतिभारित सदस्य फ़ंक्शन बार() को परिभाषित करता है। पहला ओवरलोड तब सक्षम होता है जब T, A होता है, और दूसरा तब सक्षम होता है जब T, B होता है। हालाँकि, यदि आप इस कोड को संकलित करने का प्रयास करते हैं, तो आपको एक त्रुटि संदेश मिलेगा जो दर्शाता है कि ओवरलोड का समाधान नहीं किया जा सकता है।
इस त्रुटि का कारण यह है कि SFINAE केवल व्युत्पन्न टेम्पलेट तर्कों के लिए काम करता है। क्लास टेम्प्लेट के सदस्य कार्यों के मामले में, टेम्प्लेट तर्क का अनुमान नहीं लगाया जाता है बल्कि स्पष्ट रूप से निर्दिष्ट किया जाता है। समस्या को ठीक करने के लिए, आप निम्न तकनीकों में से एक का उपयोग कर सकते हैं:
स्पष्ट टेम्पलेट तर्कों का उपयोग करें:
struct Foo
{
void bar(A) {}
void bar(B) {}
};
सदस्य कार्यों के अंदर std::enable_if का उपयोग करें:
template
struct Foo
{
template
typename std::enable_if<:is_same a>::value>::type bar() {}
template
typename std::enable_if<:is_same b>::value>::type bar() {}
};
स्पष्ट वर्ग टेम्पलेट विशेषज्ञता का उपयोग करें:
template struct Foo { void bar() {} };
template struct Foo { void bar() {} };
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3