Tôi nghĩ rằng tôi sẽ nhận được ngay vào nó và bắt đầu với mã:Làm thế nào để trả lại một 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";
}
Về cơ bản, tôi cần phải trả lại một ofstream. Tất nhiên bạn không thể sao chép một dòng, do đó, tôi không quan tâm đến mã trong bài kiểm tra lớp, và tôi đã biên dịch ở trên để biên dịch và làm việc như bạn mong đợi (trên gcc 4.5).
Nhưng tôi có cảm giác xấu đây chỉ là do trình biên dịch của tôi thực hiện "Tối ưu hóa giá trị trả về" (RTO) trên "auto os = test()". Thật vậy, nếu sửa đổi các điều sau:
int main()
{
auto os = test("testfile");
os << "Test1\n";
auto os2 = std::move(os);
os2 << "Test2\n";
}
Tôi không còn nhận được cả Test1 và Test2 ở đầu ra nữa.
Vấn đề là lớp "kiểm tra" không thể sao chép được, vì vậy không có cơ hội nào của dòng được sao chép. Tôi chỉ muốn có thể trả lại từ một hàm. Và tôi dường như có thể làm điều đó với GCC.
Tôi không muốn có con trỏ thông minh dereference cho một đống phân bổ của dòng, hoặc mở lại tệp, vì nó hiện đang hoạt động mà không làm những việc đó. Tôi chỉ có một cảm giác tôi là một chút "phi tiêu chuẩn" trong cách tiếp cận của tôi, vì vậy một cách tiêu chuẩn để làm những gì tôi đã mô tả sẽ là tuyệt vời.
Vâng, điều đó sẽ làm được. Tốt tìm thấy, mặc dù. – GManNickG
Vẫn còn đúng? –
Không giống như không. Vui lòng chỉnh sửa câu hỏi và câu trả lời nếu bạn có thể. – Clinton