Domanda

Credo che avrò a destra in esso e iniziare con il codice:

#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";
}

In sostanza, ho bisogno di restituire un ofstream. Naturalmente non è possibile copiare un ofstream, così ho giocherellava con il codice nella prova di classe, e ho avuto la precedenza per compilare e lavorare come ci si aspetterebbe (su GCC 4.5).

Ma ho una brutta sensazione questo è solo a causa del mio compilatore fare "Return Value Optimization" (RTO) su "os auto = test ()". In effetti, se modificare la seguente:

int main()
{
    auto os = test("testfile");
    os << "Test1\n";
    auto os2 = std::move(os);
    os2 << "Test2\n";
}

ottengo più sia Test1 e Test2 in uscita.

Il fatto è che il "test" classe non è copiabile, quindi non c'è alcuna possibilità di ofstream essere duplicato. Voglio solo essere in grado di restituirlo da una funzione. E mi sembra di essere in grado di farlo con GCC.

Preferirei non ha dereferenziare puntatori intelligenti a un cumulo assegnato ofstream, o riaprire il file, in quanto attualmente funziona senza fare quelle cose. Ho solo la sensazione che io sia un po ' "non standard" nel mio approccio, quindi un modo standard di fare quello che ho descritto sarebbe grande.

È stato utile?

Soluzione

ho intenzione di rispondere alla mia domanda qui:

GCC C ++ 0x Funzioni di libreria pagina , hanno uno sguardo al punto 27.9, in cui si legge:

27.9 - flussi di file-based - parziale - Missing operazioni di spostamento e di swap

Direi che è probabilmente il problema che sto avendo con gcc.

Altri suggerimenti

Il problema è con questo:

test(test&& old) {};

Questo consente di costruire una nuova test da un test rvalue, sì, ma non dice nulla circa la vostra base, che è semplicemente essere di default costruito (senza aprire il file). Quello che vuoi è questo:

test(test&& old) : std::ofstream(std::move(old)) {};

che si muoverà il flusso dal old nella base.

Fa la necessità chiamante di sapere che si sta restituendo un ofstream, o sarebbe più sensato per restituire un streambuf, e lasciare che il chiamante avvolgerla all'interno di un flusso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top