C ++ потоковый полиморф в стеке? - PullRequest
0 голосов
/ 01 октября 2011

Я хотел бы сделать что-то вроде этого:

std::wistream input = std::wifstream(text);
if (!input) input = std::wistringstream(text);
// read from input

т.е. иметь текст, интерпретируемый как имя файла, или, если такого файла не существует, использовать его содержимое вместо содержимого файла.

Конечно, я мог бы использовать std::wistream * input, а затем new и delete для реальных потоков. Но тогда я должен был бы инкапсулировать все это в классе (конструктор и деструктор, то есть надлежащий RAII для безопасности исключений).

Есть ли другой способ сделать это в стеке?

Ответы [ 4 ]

2 голосов
/ 01 октября 2011

Конечно, я мог бы использовать ввод std :: wistream *, а затем новый и удалить для фактических потоков. Но тогда я должен был бы инкапсулировать все это в классе (конструктор и деструктор, то есть надлежащий RAII для безопасности исключений).

Это то, для чего std::unique_ptr. Просто используйте std::unique_ptr<std::istream>.

2 голосов
/ 01 октября 2011

Вы можете абстрагировать логику, которая работает с std::wistream& input, в свою собственную функцию, а затем вызывать ее с std::wifstream или std::wistringstream в качестве подходящего.

1 голос
/ 01 октября 2011

Рассматривали ли вы auto_ptr или unique_ptr для управления указателем wistream?

http://www.cplusplus.com/reference/std/memory/auto_ptr/

1 голос
/ 01 октября 2011

Есть ли другой способ сделать это в стеке?

Нет способа.

Поскольку назначение копирования отключено для всех классов потока вC ++ , вы не можете его использовать. Это сразу означает, что то, что вы хотите, невозможно.

...