myślę, że będę uzyskać prawo do niego i rozpocząć z kodem:Jak zwrócić 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";
}
Zasadniczo, muszę zwrócić ofstream. Oczywiście nie można skopiować kodu źródłowego, więc zacząłem manipulować przy kodzie w teście klasy, i otrzymałem powyższe, aby skompilować i pracować tak, jak można by oczekiwać (na gcc 4.5).
Ale mam złe przeczucie, że to właśnie ze względu na mój kompilator robi "Optymalizacja wartości zwrotu" (RTO) na "auto os = test()". Rzeczywiście, jeśli modyfikować na następujące kwestie:
int main()
{
auto os = test("testfile");
os << "Test1\n";
auto os2 = std::move(os);
os2 << "Test2\n";
}
już nie dostać zarówno Test1 i test2 na wyjściu.
Chodzi o to, że "test" w klasie nie podlega kopiowaniu, więc nie ma szans na powielenie go. Po prostu chcę móc go zwrócić z funkcji. I wydaje się, że mogę to zrobić z GCC.
Wolałbym nie mieć inteligentnych wskaźników dereferencji do przydzielonego sterty lub ponownego otwarcia pliku, ponieważ obecnie działa bez robienia tych rzeczy. Po prostu mam wrażenie, że jestem trochę "niestandardowy" w moim podejściu, więc standardowy sposób robienia tego, co opisałem, będzie świetny.
Tak, to by to zrobiło. Dobre znalezisko. – GManNickG
Nadal prawda? –
Wygląda na to, że nie. Jeśli możesz, możesz edytować pytanie i odpowiedź. – Clinton