मेरे पास दो सामान्य विधियां हैं (संपादित करें: वास्तव में ऑपरेटरों लेकिन समस्या विधियों के लिए समान है) जो समान हैं, सिवाय इसके कि एक संदर्भ द्वारा अपने औपचारिक पैरामीटर का उपयोग करता है और दूसरी विधि मूल्य द्वारा अपने औपचारिक पैरामीटर का उपयोग करती है .

struct shout_t {
    template<typename T>
    shout_t& operator<<(T &x) { cout << x; return *this; } // by reference
    
    template<typename T>
    shout_t& operator<<(T x) { cout << x; return *this; } // by value
};

"बाय-रेफरेंस" विधि का उद्देश्य "बड़ी" वस्तुओं को बिना कॉपी किए उपयोग करने की अनुमति देना है। "बाय-वैल्यू" विधि का उद्देश्य शाब्दिक है।

चूंकि "बाय-वैल्यू" विधि दोनों मामलों (ऑब्जेक्ट्स प्रति से और अक्षर) को संभाल सकती है, यह एक त्रुटि देता है:

int main() { // Here "large object" ~ string, "literal" ~ int
    shout_t shout;
    shout << 42; // OK
    shout << "FTL"; // ERROR: Overloaded operator '<<' is ambiguous
}

मैं जिस व्यवहार की तलाश कर रहा था वह है पहले प्रयास करें यदि "बाय-रेफरेंस" विधि लागू होती है, यदि नहीं, तो "बाय-वैल्यू" विधि लागू करें।

इसका समाधान कैसे करें? दो तरीकों के इच्छित व्यवहार को कैसे प्राप्त करें जो उनके "बाय-वैल्यू" और "बाय-रेफरेंस" हस्ताक्षर को छोड़कर समान हैं?

2
mrchance 19 अक्टूबर 2020, 14:23

1 उत्तर

सबसे बढ़िया उत्तर

यहां दो परिदृश्य हैं, या तो आप पैरामीटर के रूप में पारित वस्तु को बदलना चाहेंगे, या आप नहीं। बाद के मामले में, const-योग्य संदर्भ के रूप में पास करें:

struct shout_t {
    template<typename T>
    shout_t& operator<<(const T &item) { cout << item; return *this; }
};

और अन्यथा, std::forward के साथ संयोजन में एक अग्रेषण संदर्भ का उपयोग करें:

struct shout_t {
    template<typename T>
    shout_t& operator<<(T&& item) { cout << std::forward<T>(item); return *this; }
};
1
lubgr 19 अक्टूबर 2020, 14:26