Question

Je pense que je vais entrer dans le vif et commencer par le code:

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

En fait, je dois retourner un ofstream. Bien sûr, vous ne pouvez pas copier un ofstream, donc je bidouillé avec le code dans le test de classe, et je suis arrivé ci-dessus pour compiler et le travail que vous attendez (sur gcc 4.5).

Mais j'ai un mauvais pressentiment que c'est juste en raison de mon compilateur faire "Return Value Optimization" (RTO) sur "os auto = test ()". En effet, si modifier à ce qui suit:

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

Je ne reçois à la fois et Test2 dans Test1 la sortie.

La chose est, la classe « test » n'est pas copiable, donc il n'y a aucune chance de ofstream être dupliqué. Je veux juste être en mesure de retourner à partir d'une fonction. Et je crois pouvoir le faire avec GCC.

Je préfère ne pas avoir déréférencer des pointeurs intelligents à un tas alloué ofstream, ou rouvrir le dossier, car il fonctionne actuellement sans faire ces choses. J'ai juste un sentiment que je suis un peu « non standard » dans mon approche, donc un moyen standard de faire ce que je viens de décrire serait grand.

Était-ce utile?

La solution

Je vais répondre à ma propre question ici:

Dans le GCC C ++ 0x Fonctions de bibliothèque , ont un oeil à l'article 27.9, qui se lit comme suit:

27.9 - flux basés sur des fichiers - partiels - manquant opérations de déplacement et de swaps

Je suppose que c'est probablement la question que je vais avoir avec gcc.

Autres conseils

Le problème est avec ceci:

test(test&& old) {};

Cela vous permet de construire une nouvelle test d'un test rvalue, oui, mais il ne dit rien sur votre base, ce qui est tout simplement être construit par défaut (pas de fichier ouvert). Ce que vous voulez est la suivante:

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

Ce qui va déplacer le flux de old dans la base.

Est-ce que le besoin de l'appelant de savoir que vous retournez un ofstream, ou serait-il plus judicieux de retourner un streambuf, et laisser l'appelant envelopper dans un flux?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top