私は右のそれに入ると、コードで始まると思う:(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のを返却する必要があります。もちろん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の両方が表示されなくなりました。
「テスト」というクラスはコピーできないため、ストリームが重複することはありません。私はちょうど関数からそれを返すことができるようにしたい。そして、私はGCCでそれを行うことができるようです。
私は、ofstreamを割り当てられたヒープへのスマートポインタを逆参照したり、ファイルを再オープンしたりするのではなく、現在そのようなことをすることなく動作します。私は自分のアプローチで少し「非標準的」な気がしているので、私が記述したことを行うための標準的な方法は素晴らしいでしょう。
ええ、それはそれをするでしょう。しかし、良い見つける。 – GManNickG
まだ本当ですか? –
いいえのようには見えません。できるだけ質問と回答を編集してください。 – Clinton