Enable_If शर्तों का उपयोग करके एक सदस्य फ़ंक्शन का चयन करना
कार्य क्लास टेम्पलेट पैरामीटर के आधार पर एक सदस्य फ़ंक्शन के आह्वान को निर्धारित करना है। निम्नलिखित कोड स्निपेट इसे प्राप्त करने का प्रयास करता है:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout हालाँकि, यह कोड "struct std::enable_if' में 'type' नाम का कोई प्रकार नहीं" त्रुटि के साथ संकलित होने में विफल रहता है।
SFINAE in Action
इस मुद्दे को समझने की कुंजी प्रतिस्थापन विफलता एक त्रुटि नहीं है (SFINAE) की अवधारणा में निहित है। Enable_if टेम्पलेट तर्कों के आधार पर सशर्त संकलन की अनुमति देता है। इस मामले में, टेम्प्लेट तर्क टी पहले से ही ज्ञात होता है जब सदस्य फ़ंक्शन तत्काल होते हैं। इसलिए, स्थिति का मूल्यांकन तत्काल समय पर किया जाता है और संबंधित फ़ंक्शन का चयन किया जाता है।
कोड को ठीक करना
इसे सुधारने के लिए, हमें एक डमी टेम्पलेट तर्क प्रस्तुत करने की आवश्यकता है टी के लिए डिफ़ॉल्ट है। यह SFINAE तंत्र को इच्छानुसार काम करने की अनुमति देता है। संशोधित कोड इस तरह दिखेगा:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout स्पष्ट सदस्य फ़ंक्शन विशेषज्ञता को रोकना
जैसा कि HostileFork द्वारा बताया गया है, मूल कोड सदस्य कार्यों के लिए टेम्पलेट तर्कों के स्पष्ट विनिर्देश की अनुमति देता है, जिसके कारण ग़लत परिणाम. इसे रोकने के लिए, हम एक static_assert जोड़ सकते हैं जो जाँचता है कि कोई टेम्पलेट तर्क प्रदान किया गया है या नहीं। यह सुनिश्चित करता है कि सही सदस्य फ़ंक्शन हमेशा टेम्प्लेट तर्क टी के आधार पर लागू किया जाता है। संशोधित कोड होगा:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3