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

`enable_if` का उपयोग करके टेम्पलेट पैरामीटर के आधार पर सदस्य फ़ंक्शन का चयन कैसे करें?

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

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

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