私はそれに正しく入り、コードから始めると思います:
#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をコピーすることはできないので、クラステストのコードをいじって、上記をコンパイルして期待どおりに動作させました(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でそれを行うことができるようです。
現在、これらのことを行わなくても機能するため、ストリームに割り当てられたヒープへのスマートポインターを逆参照したり、ファイルを再度開いたりしたくありません。私は自分のアプローチが少し「非標準的」であると感じているので、私が説明したことを行う標準的な方法は素晴らしいでしょう。