मेरे पास दो सामान्य विधियां हैं (संपादित करें: वास्तव में ऑपरेटरों लेकिन समस्या विधियों के लिए समान है) जो समान हैं, सिवाय इसके कि एक संदर्भ द्वारा अपने औपचारिक पैरामीटर का उपयोग करता है और दूसरी विधि मूल्य द्वारा अपने औपचारिक पैरामीटर का उपयोग करती है .
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
}
मैं जिस व्यवहार की तलाश कर रहा था वह है पहले प्रयास करें यदि "बाय-रेफरेंस" विधि लागू होती है, यदि नहीं, तो "बाय-वैल्यू" विधि लागू करें।
इसका समाधान कैसे करें? दो तरीकों के इच्छित व्यवहार को कैसे प्राप्त करें जो उनके "बाय-वैल्यू" और "बाय-रेफरेंस" हस्ताक्षर को छोड़कर समान हैं?
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; }
};
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।