मैं एक फ़ंक्शन को अधिभारित करना चाहता हूं ताकि यह किसी भी तरीके से अपना तर्क बदल सके और फिर तर्क का संदर्भ देता है - लेकिन यदि तर्क उत्परिवर्तनीय नहीं है, तो उसे तर्क के प्रति की प्रतिलिपि बनाना चाहिए बजाय। उम्र के साथ इसके साथ गड़बड़ करने के बाद, मैं यहां आया हूं।rvalue function overloading
using namespace std;
string& foo(string &in)
{
in.insert(0, "hello ");
return in;
}
string foo(string &&in)
{
return move(foo(in));
}
string foo(const string& in)
{
return foo(string(in));
}
यह कोड सही ढंग से काम करता प्रतीत होता है, लेकिन मुझे यह जानने में दिलचस्पी है कि कोई इसे करने का बेहतर तरीका सोच सकता है या नहीं।
int main(void)
{
string var = "world";
const string var2 = "const world";
cout << foo(var) << endl;
cout << var << endl;
cout << foo(var2) << endl;
cout << var2 << endl;
cout << foo(var + " and " + var2) << endl;
return 0;
}
सही उत्पादन
hello world
hello world
hello const world
const world
hello hello world and const world
है मैं समझ यह थोड़ा neater होगा अगर मैं ऐसा कर सकता है:
यहाँ एक परीक्षण कार्यक्रम है
string& foo(string &in)
{
in.insert(0, "hello ");
return in;
}
string foo(string in)
{
return move(foo(in));
}
बेशक
, यह काम नहीं करता है क्योंकि अधिकांश फ़ंक्शन foo
पर संदिग्ध होंगे - 01 में कॉल सहितखुद! लेकिन अगर मैं पहले किसी को प्राथमिकता देने के लिए संकलक को बता सकता हूं ...
जैसा कि मैंने कहा था, मैंने जो कोड पोस्ट किया है वह सही तरीके से काम करता है। मुख्य बात जो मुझे पसंद नहीं है वह दोहराव वाला अतिरिक्त कोड है। अगर मेरे पास इस तरह के कार्यों का एक गुच्छा था तो यह काफी गड़बड़ हो जाएगा, और इसमें से अधिकांश बहुत दोहराएंगे। तो मेरे प्रश्न के दूसरे भाग के रूप में: क्या कोई व्यक्ति दूसरे और तीसरे foo
कार्यों के लिए स्वचालित रूप से कोड उत्पन्न करने का तरीका सोच सकता है? उदाहरण के लिए
// implementation of magic_function_overload_generator
// ???
string& foo(string &in);
magic_function_overload_generator<foo>;
string& bar(string &in);
magic_function_overload_generator<bar>;
// etc
यह डरावना लगता है। इस समारोह के आधार पर कि मैं फ़ंक्शन को किस प्रकार पास करता हूं, परिणामी स्थिति वापसी मूल्य * और पैरामीटर * पूरी तरह अलग हो सकती है। यह सिर्फ सूक्ष्म बग के लिए पूछ रहा है। क्यों उपयोगकर्ता को यह तय नहीं करना चाहिए कि वह वस्तु को संशोधित करना चाहता है या अलग-अलग कार्यों को स्पष्ट रूप से कॉल करके एक प्रतिलिपि वापस कर सकता है? – jalf
यह मेरे लिए विशेष रूप से डरावना प्रतीत नहीं होता है, लेकिन शायद आप सही हैं। जिस तरह से मैं सोचता हूं वह यह है कि जब भी यह सक्षम हो जाता है तो फ़ंक्शन इनपुट बदलता है; लेकिन अगर यह नहीं कर सकता ... तो यह नहीं करता है, लेकिन यह अभी भी सही वापसी मूल्य देता है। जिस तरह की चीज मैं इसका उपयोग कर सकता हूं वह "पंचट्यूएट" फ़ंक्शन जैसा कुछ है, जो खराब विराम चिह्न वाली स्ट्रिंग लेता है और इसे ठीक करता है। आप सीधे परिणाम को सीट पर भेजना चाहते हैं, या आप बाद में स्ट्रिंग पर कुछ अन्य ऑपरेशन करना चाहेंगे। तो कभी-कभी आप निरंतर मूल्यों को पार कर सकते हैं, और कभी-कभी ... अच्छी तरह से आपको विचार मिलता है। – karadoc
लेकिन मेरा मुद्दा यह है कि क्या या एक या दूसरा होता है कि प्रोग्रामर क्या चाहता है, इस पर निर्भर करता है, लेकिन कुछ अपेक्षाकृत सूक्ष्म अर्थपूर्ण विवरणों पर (तर्क प्रकार का आधार है या नहीं? क्या यह एक रैल्यू है या नहीं?), जो आसानी से निर्णय लेने के बिना प्रोग्राम के बिना समय के साथ बदल सकता है कि "अब मैं ऑब्जेक्ट को संशोधित करने के बजाय एक प्रतिलिपि वापस करना चाहता हूं"। मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन यह एक निर्णय है कि प्रोग्रामर आसानी से कर सकता है, और जहां आपकी लाइब्रेरी गलत अनुमान लगाती है, संभावित रूप से बहुत खराब परिणाम हो सकते हैं। – jalf