Frage

Ich denke, ich werde gleich eingehen und mit dem Code beginnen:

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

Grundsätzlich muss ich einen Ofstream zurückgeben. Natürlich können Sie einen Ofstream nicht kopieren, also habe ich im Klassentest mit dem Code herumgespielt, und ich habe das oben genannte zu kompilieren und zu arbeiten, wie Sie es erwarten würden (auf GCC 4.5).

Aber ich habe das schlechte Gefühl, dass dies nur daran zurückzuführen ist, dass mein Compiler "Return Value Optimization" (RTO) unter "Auto OS = Test ()" "macht. In der Tat, wenn Sie Folgendes ändern:

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

Ich bekomme nicht mehr sowohl Test1 als auch Test2 in der Ausgabe.

Die Sache ist, die Klasse "Test" ist nicht kopierbar, daher besteht keine Chance, dass der Stream dupliziert wird. Ich möchte es nur aus einer Funktion zurückgeben können. Und ich scheine mit GCC in der Lage zu sein.

Ich hätte lieber die Smart -Zeiger auf einen Haufen, das Stream zugeteilt oder die Datei wieder eröffnet, da sie derzeit funktioniert, ohne diese Dinge zu tun. Ich habe nur das Gefühl, dass ich in meinem Ansatz ein wenig "nicht standardmäßig" bin. Eine Standardmethode, um das zu tun, was ich beschrieben habe, wäre großartig.

War es hilfreich?

Lösung

Ich werde hier meine eigene Frage beantworten:

In dem GCC C ++ 0x Bibliotheksfunktionen Seite, schauen Sie sich Artikel 27.9 an, der lautet:

27.9 - Dateibasierte Streams - teilweise - fehlende Bewegung und Swap -Operationen

Ich denke, das ist wahrscheinlich das Problem, das ich mit GCC habe.

Andere Tipps

Das Problem ist damit:

test(test&& old) {};

Dadurch können Sie ein neues konstruieren test Aus einem RValue test, Ja, aber es sagt nichts über Ihre Basis aus, die einfach standardmäßig konstruiert wird (keine geöffnete Datei). Was Sie wollen, ist Folgendes:

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

Das wird den Stream von bewegen old in die Basis.

Muss der Anrufer wissen, dass Sie eine zurückgeben? ofstream, oder wäre es sinnvoller, a zurückzukehren streambuf, und lassen Sie ihn den Anrufer in einen Stream einwickeln?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top