"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > SFINAE क्लास टेम्प्लेट के सदस्य कार्यों के साथ काम क्यों नहीं करता?

SFINAE क्लास टेम्प्लेट के सदस्य कार्यों के साथ काम क्यों नहीं करता?

2024-11-10 को प्रकाशित
ब्राउज़ करें:226

Why Doesn't SFINAE Work with Member Functions of Class Templates?

क्लास टेम्पलेट के सदस्य कार्यों के लिए SFINAE (enable_if) काम क्यों नहीं करता?

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