creo que voy a conseguir la derecha en ella y empezar con el código:Cómo devolver un 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";
}
Básicamente, tengo que devolver un ofstream. Por supuesto, no puedes copiar un flujo de corriente, así que jugueteé con el código en la prueba de clase, y obtuve lo anterior para compilar y trabajar como es de esperar (en gcc 4.5).
Pero tengo una mala sensación de que esto se deba a que mi compilador realiza "Optimización del valor de retorno" (RTO) en "auto os = test()". De hecho, si se modifica a lo siguiente:
int main()
{
auto os = test("testfile");
os << "Test1\n";
auto os2 = std::move(os);
os2 << "Test2\n";
}
Ya no recibo tanto Test1 como Test2 en la salida.
El problema es que la clase "prueba" no se puede copiar, por lo que no hay posibilidad de que el flujo de corriente se duplique. Solo quiero poder devolverlo desde una función. Y creo que puedo hacer eso con GCC.
Prefiero no tener punteros inteligentes de referencia en un montón asignado de corriente, o volver a abrir el archivo, ya que actualmente funciona sin hacer esas cosas. Solo tengo la sensación de que estoy siendo un poco "no estándar" en mi enfoque, por lo que una forma estándar de hacer lo que he descrito sería genial.
Sí, eso lo haría. Buen descubrimiento, sin embargo. – GManNickG
¿Sigue siendo cierto ahora? –
No parece que no. Siéntase libre de editar la pregunta y la respuesta si puede. – Clinton