Разрешить stringstream и outstream в качестве параметра

#c #stream

#c #поток

Вопрос:

Я пытаюсь написать функцию, которая записывает информацию в поток. Мне нужно иметь возможность передавать его либо в stringstream, либо в ostream. Я попытался объявить функцию с F(std::ios* out) помощью , но позже, когда я использую << оператор для записи в него, я получаю эту ошибку : error: no match for operator<< . Как я должен объявлять функцию?

Ответ №1:

Я думаю, вы ищете ссылки на c

 void F(std::ostreamamp; out)
{
}
  

сработало бы; Обратите внимание, что это предполагает char потоки, в противном случае:

 template <typename Char/*=char*/, typename Traits/*=std::char_traits<CharT> */>
    void F(std::basic_ostream<Char, Traits>amp; os)
{
}
  

Комментарии:

1. Существует также Traits параметр шаблона.

2. @K-ballo: должным образом отмечено; теперь, где, я думаю, я видел, что аргументы шаблона по умолчанию могут быть разрешены для функций в c 11?

3. В C 11 разрешены аргументы шаблона по умолчанию, но здесь нет необходимости их использовать, поскольку аргументы всегда должны совпадать с аргументами потока.

4. @sehe : Вот начало .

Ответ №2:

Прежде всего, вам, вероятно, следует передать ссылку на поток, потому что в противном случае вам придется писать (*out)<< , чтобы заставить оператор вставки работать правильно (он работает с потоками, а не с указателями на потоки).

Но что более важно, std::ios это всего лишь один из базовых классов потоков, а именно тот, который содержит члены классов ввода-вывода, которые не зависят от параметров шаблона.

Если вы хотите получить общий выходной поток, вы должны принять ссылку на std::ostream (для char потоков на основе) или на std::wostream (для wchar_t потоков на основе); если вы хотите перейти на общий, вы должны создать свой шаблон функции для char_type и char_traits разрешить все варианты std::basic_ostream class (обратите внимание, однако, что запись символов не зависит от типакод часто совсем не прост, и если он вам не нужен, возможно, он не стоит усилий — лучше использовать стратегию some TCHAR -like).

Итак, вероятно, вы хотите:

 F(std::ostream amp; out)
  

(для входных потоков это точно то же самое, но с std::istream / std::wistream / std::basic_istream )

Ответ №3:

stringstream является ostream . Общие функции ввода-вывода обычно должны принимать либо ostream или istream в качестве ссылки.

 void fun(std::ostreamamp; out);
  

Это будет работать с обоими stringstream и другими ostream подклассами, например fstream .

Комментарии:

1. Общие функции ввода-вывода должны принимать либо basic_ostream<> или basic_istream<> в качестве ссылки, вместо ограничения типов символов и признаков потока.

2. @ildjarn: с другой стороны, если вам нужно написать какой char_type -либо независимый от строки ввод-вывод, он быстро превращается в беспорядок и может не стоить затраченных усилий ( TCHAR подобные альтернативы могут быть проще реализованы).