मुझे लगता है कि मैं इस पर सही हो और कोड के साथ शुरू करेंगे:कैसे एक fstream (C++ 0x) वापस जाने के लिए
#include <iostream>
#include <fstream>
#include <string>
class test : public std::ofstream
{
public:
test(const std::string& filename) { this->open(gen_filename(filename)); };
test(const test&) = delete;
//test(test&& old) = default; // Didn't compile
test(test&& old) {};
private:
std::string gen_filename(const std::string& filename)
{ return filename + ".tmp"; }
};
int main()
{
auto os = test("testfile");
os << "Test1\n";
os << "Test2\n";
}
मूल रूप से, मैं एक ofstream लौटना ही होगा। बेशक आप एक ऑफस्ट्रीम की प्रतिलिपि नहीं बना सकते हैं, इसलिए मैंने क्लास टेस्ट में कोड के साथ चारों ओर झुकाया, और मैंने उपरोक्त को संकलित और काम करने के लिए मिल गया जैसा आप उम्मीद करेंगे (जीसीसी 4.5 पर)।
लेकिन मुझे बुरा लगता है कि यह मेरे कंपाइलर के कारण "ऑटो ओएस = टेस्ट()" पर "रिटर्न वैल्यू ऑप्टिमाइज़ेशन" (आरटीओ) कर रहा है। दरअसल, यदि निम्न में संशोधित करें:
int main()
{
auto os = test("testfile");
os << "Test1\n";
auto os2 = std::move(os);
os2 << "Test2\n";
}
अब मुझे आउटपुट में टेस्ट 1 और टेस्ट 2 दोनों नहीं मिलते हैं।
बात यह है कि कक्षा "परीक्षण" कॉपी करने योग्य नहीं है, इसलिए ऑफस्ट्रीम को डुप्लिकेट करने का कोई मौका नहीं है। मैं बस इसे एक समारोह से वापस करने में सक्षम होना चाहता हूँ। और मैं जीसीसी के साथ ऐसा करने में सक्षम हूं।
मुझे बदले में एक ढेर के लिए स्मार्ट पॉइंटर्स को हटाना नहीं होगा, या फ़ाइल को फिर से खोलना होगा, क्योंकि यह वर्तमान में उन चीजों को किए बिना काम करता है। मुझे बस एक एहसास है कि मैं अपने दृष्टिकोण में थोड़ा "गैर-मानक" हूं, इसलिए मैंने जो वर्णन किया है उसका एक मानक तरीका बहुत अच्छा होगा।
हाँ, वह ऐसा करेगा। अच्छा खोज, यद्यपि। – GManNickG
अभी भी सच है? –
ऐसा नहीं लगता है। यदि आप कर सकते हैं तो प्रश्न और उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। – Clinton