Когда использовать std::swap для потоков?

Пытаясь дать ответ на этот вопрос, text-file-handling-in-c дает ссылки на cplusplus.com. Я наткнулся на функцию std::swap для потоков типа fstream.

Итак, мой вопрос: какова цель функции подкачки, например. для «fstream» соответственно, в какой ситуации я должен его использовать?

Ссылаясь на вопросы и ответы C++ std::ifstream в проблеме конструктора, я знаю, что типы потоков являются не копируемыми. Ссылаясь на вопросы и ответы Что такое идиома копирования и подкачки? функциональность подкачки, например дается для реализации конструктора копирования,... . Итак, потоковые типы, имеющие функцию swapping, теперь могут быть скопированы с функцией swap -> Если да, то как разработчики языка добились этого?


person mbed_dev    schedule 11.07.2015    source источник


Ответы (1)


Что ж, неудивительно, что вы используете std::swap для потоков, когда хотите поменять местами потоки. Вы можете, например, использовать это для std::remove_if всех "плохих" потоков из вектора потоков (хорошо, это, вероятно, не лучший пример. Я не могу придумать лучшего, что пришло мне в голову).

Что касается того, как это работает: начиная с С++ 11, стандартные потоки можно конструировать и назначать при перемещении. Поэтому, хотя вы все еще не можете скопировать их, вы можете поменять их местами с помощью общей функции подкачки, например:

template <class T>
void swap (T &a, T &b) {
    auto temp = std::move(a);
    a = std::move(b);
    b = std::move(temp);
}

Теперь наши потоки меняются местами без необходимости их копирования.

Кстати, обмен потоками не делает их копируемыми. Когда вы смотрите пример копирования оператора присваивания

MyClass& operator=(const MyClass& other)
{
    MyClass tmp(other);
    swap(tmp);
    return *this;
}

из вопроса, который вы связали, вы заметите эту строку:

MyClass tmp(other);

для которого требуется конструктор копирования, чего нет у потоков.

person Baum mit Augen    schedule 11.07.2015
comment
+1. Кроме того, существуют специальные функции swap для fstream и stringstream, которые немного более эффективны, чем общий алгоритм swap. - person Howard Hinnant; 11.07.2015