Вопрос

Думаю, я пойду прямо в это и начну с кода:

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

По сути, мне нужно вернуть Oftream. Конечно, вы не можете скопировать Oftream, поэтому я возился с кодом в тесте класса, и я получил вышеупомянутое для компиляции и работы, как и следовало ожидать (на GCC 4.5).

Но у меня плохое ощущение, что это просто из -за того, что мой компилятор делает «оптимизация возврата» (RTO) на «Auto OS = test ()». Действительно, если изменить на следующее:

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

Я больше не получаю тест1 и test2 в выходе.

Дело в том, что класс «тест» не копируется, поэтому нет шансов на дублирование Oftream. Я просто хочу иметь возможность вернуть его из функции. И я, кажется, могу сделать это с GCC.

Я бы предпочел, чтобы не было разумных умных указателей на кучу, выделенную OftStream, или повторно открыть файл, так как в настоящее время он работает без этих вещей. У меня просто такое чувство, что я немного «нестандартный» в своем подходе, поэтому стандартный способ сделать то, что я описал, был бы здорово.

Это было полезно?

Решение

Я собираюсь ответить на свой собственный вопрос здесь:

в GCC C ++ 0x Библиотека функции Страница, посмотрите на пункт 27.9, который гласит:

27.9 - Потоки на основе файлов - частичные - отсутствующие операции перемещения и обмена

Я думаю, это, вероятно, проблема, с которой я сталкиваюсь с GCC.

Другие советы

Проблема в этом:

test(test&& old) {};

Это позволяет построить новый test Из RValue test, Да, но это ничего не говорит о вашей базе, которая просто строится по умолчанию (без открытого файла). Вы хотите:

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

Который переместит поток из old в базу.

Значит ли звонящий, что вы возвращаете ofstream, или было бы больше смысла вернуть streambuf, и позволить вызывающему завернуть его внутрь ручья?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top