दलील
मैं C++ में कार्य से बचने के लिए कोड पूरी तरह से कोशिश करने के लिए अस्थायी। यही है, मैं केवल प्रारंभिकरण का उपयोग करता हूं और स्थानीय चर को const
के रूप में घोषित करता हूं (यानी हमेशा लूप चर या accumulators को छोड़कर)।बाइंड गैर स्थिरांक संदर्भ
अब, मुझे एक ऐसा मामला मिला है जहां यह काम नहीं करता है। मेरा मानना है कि यह एक सामान्य पद्धति है, लेकिन विशेष रूप से यह निम्न स्थिति में पैदा होती है:
समस्या विवरण
चलो कहते हैं कि मैं एक प्रोग्राम है जो एक स्ट्रिंग में एक इनपुट फ़ाइल की सामग्री को लोड करता चला रहे हैं। आप या तो फ़ाइल नाम (tool filename
) या मानक इनपुट स्ट्रीम (cat filename | tool
) का उपयोग करके टूल को कॉल कर सकते हैं। अब, मैं स्ट्रिंग कैसे शुरू करूं?
निम्नलिखित काम नहीं करता:
bool const use_stdin = argc == 1;
std::string const input = slurp(use_stdin ? static_cast<std::istream&>(std::cin)
: std::ifstream(argv[1]));
क्यों यह काम नहीं करता है? क्योंकि slurp
के प्रोटोटाइप के रूप में निम्नानुसार ही नज़र आना चाहिए:
std::string slurp(std::istream&);
है, तर्क मैं गैर - const
और एक परिणाम के रूप में मैं यह एक अस्थायी करने के लिए बाध्य नहीं कर सकते। एक अलग चर का उपयोग कर इस के आसपास एक रास्ता प्रतीत नहीं होता है।
बदसूरत वर्कअराउंड
पल में, मैं निम्नलिखित समाधान का उपयोग करें:
std::string input;
if (use_stdin)
input = slurp(std::cin);
else {
std::ifstream in(argv[1]);
input = slurp(in);
}
लेकिन यह मुझे गलत तरीके से रगड़ रहा है। सबसे पहले यह अधिक कोड (एसएलओसी में) है लेकिन यह (यहां) अधिक तार्किक सशर्त अभिव्यक्ति के बजाय if
का उपयोग कर रहा है, और यह घोषणा के बाद असाइनमेंट का उपयोग कर रहा है जिसे मैं टालना चाहता हूं।
प्रारंभिकरण की इस अप्रत्यक्ष शैली से बचने का कोई अच्छा तरीका है? समस्या उन सभी मामलों में सामान्यीकृत की जा सकती है जहां आपको एक अस्थायी वस्तु को म्यूट करने की आवश्यकता है। ऐसे मामलों से निपटने के लिए बीमार तरीके से स्ट्रीम नहीं किए गए हैं (const
स्ट्रीम का कोई मतलब नहीं है, और फिर भी एक अस्थायी धारा पर काम करना समझ में आता है)?
क्यों 'static_cast' की आवश्यकता है? –
@ एनएम .: कंपाइलर '?:' के माध्यम से नहीं देख सकता है। ':' के दोनों तरफ एक ही प्रकार का होना चाहिए। –
'slurp' क्या कर रहा है? :) –