我想我会直接进入它并从代码开始:
#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。当然,你不能复制 ofstream,所以我在类测试中摆弄了代码,我得到了上面的编译和工作,就像你期望的那样(在 gcc 4.5 上)。
但我有一种不好的感觉,这只是因为我的编译器在“auto os = test()”上做了“返回值优化”(RTO)。确实,如果修改为以下内容:
int main()
{
auto os = test("testfile");
os << "Test1\n";
auto os2 = std::move(os);
os2 << "Test2\n";
}
我不再在输出中同时得到 Test1 和 Test2 。
问题是,“test”类是不可复制的,因此 ofstream 不可能被复制。我只是希望能够从函数中返回它。我似乎可以用 GCC 做到这一点。
我宁愿不要取消引用指向分配的流的堆的智能指针,也不要重新打开文件,因为它目前可以在不做这些事情的情况下工作。我只是觉得我的方法有点“不标准”,所以用标准的方式来做我所描述的事情会很棒。