penso avrò a destra in esso e iniziare con il codice:Come restituire 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";
}
Fondamentalmente, ho bisogno di restituire un ofstream. Ovviamente non è possibile copiare un ofstream, quindi ho giocato con il codice nel test di classe, e ho ottenuto quanto sopra per compilare e lavorare come ci si aspetterebbe (su gcc 4.5).
Ma ho la brutta sensazione che ciò è dovuto al fatto che il mio compilatore sta eseguendo "Return Value Optimization" (RTO) su "auto os = test()". Effettivamente, se si modifica quanto segue:
int main()
{
auto os = test("testfile");
os << "Test1\n";
auto os2 = std::move(os);
os2 << "Test2\n";
}
Non riesco più a ottenere Test1 e Test2 nell'output.
Il fatto è che il "test" di classe non è copiabile, quindi non c'è alcuna possibilità che l'ofstream venga duplicato. Voglio solo essere in grado di restituirlo da una funzione. E mi sembra di essere in grado di farlo con GCC.
Preferisco non avere riferimenti puntatori intelligenti a un heap allocato distream o riaprire il file, poiché attualmente funziona senza eseguire tali operazioni. Ho solo la sensazione di essere un po '"non standard" nel mio approccio, quindi un modo standard per fare quello che ho descritto sarebbe fantastico.
Sì, lo farebbe. Buona scoperta, però. – GManNickG
Ancora vero ora? –
Non sembra che no. Sentiti libero di modificare la domanda e rispondere se puoi. – Clinton