2013-04-10 3 views
4

Как известно, невозможно иметь standard collection of references. Также невозможно скопировать объект потока.Как создать коллекцию объектов потока

Но что, если я хочу создать коллекцию (скажем, std::vector) объектов потока или ссылок на объект потока?

Я знаю, что могу обернуть ссылку на объект потока, например. структуру, но тогда вам нужно либо реализовать полный интерфейс (если вы хотите использовать оболочку непосредственно как поток, который я бы предпочел), либо использовать общедоступную функцию getter и использовать ее везде, чтобы получить фактический поток.

Есть ли более простой способ? Решения C++ 11 в порядке.

+0

Почему бы не использовать набор указателей? – riv

+0

Или набор интеллектуальных указателей, если необходимо их автоматически уничтожить? – nob

+2

Как насчет коллекции 'std :: reference_wrapper '? – juanchopanza

ответ

7

У вас нет контейнера с ссылками, но у вас может быть контейнер std::reference_wrapper. Может быть, вы хотите что-то вроде:

std::vector<std::reference_wrapper<stream_type>> v; 

Вы можете лечить std::reference_wrapper очень похоже на ссылки (на самом деле, это неявное преобразование ссылочного типа), но оно имеет дополнительное преимущество в том, тип объекта.

+0

+1 мои мысли точно! – juanchopanza

+0

Просто протестирован и отлично работает. Все еще нужно использовать функцию 'get' для получения ссылочного потока, если он используется непосредственно, например. вывода или ввода, но не при переходе к другим функциям. Я могу жить с этим. –

0

Вы можете использовать не Copyable объекты в коллекциях:

// this uses move constructors 
std::vector<std::fstream> v {std::fstream{"file1.txt"}, std::fstream{"file2.txt"}}; 

// this doesn't require the type to even be movable 
v.emplace_back("file3.txt"); 

Хотя избегая указатель и ссылаться на подобные Типы этот путь будет работать, только если вам не нужно использовать потоки, как полиморфные объекты.

Смежные вопросы