Как написать универсальную функцию для работы с разными типами потоков? - PullRequest
1 голос
/ 17 февраля 2012

Я пытаюсь написать небольшое приложение для обработки сетевого пакета. Надеюсь, что для облегчения теста это приложение может работать в двух режимах: режим локальной потоковой передачи (с использованием std::cin) и режим сетевой потоковой передачи (с использованием asio) - в зависимости от того, предоставлена ​​ли, например, в командной строке номер порта. Цель состоит в том, чтобы сделать его прозрачным для остальных клиентских классов, которые выполняют фактический анализ пакета, например, они могут получить ссылку на поток event_stream, а затем выполнить синтаксический анализ как:

event_stream >> MsgHeader;

Предполагая, что класс MsgHeader имеет оператор перегрузки >>.

Для режима локального потока: я просто возвращаю &cin. Для сетевого режима, я надеюсь, что смогу сделать что-то вроде этого:

boost::asio::io_service io_s;
tcp::acceptor acc(io_s. tcp::endpoint(tcp::v4(), 1950));
tcp::iostream stream;
acc.accept(*stream.rdbuf()); // act as server, another client will write to it.
return &stream;

Но я немного растерялся, как заставить остальных клиентов "не знать", с каким потоком они имеют дело? Могу ли я просто объявить это как:

std::istream &in = get_event_stream();

1 Ответ

1 голос
/ 17 февраля 2012

Две возможности:

  1. Шаблонизируйте все в типе потока. Может быть излишним, но допускает гибкость для потоков, которые не все придерживаются стандартного интерфейса (через специализацию). Разные интерфейсы будут нуждаться в разных специализациях, но высокоуровневый интерфейс (вызов шаблона) будет как минимум единообразным.

  2. Убедитесь, что все используемые вами потоки наследуются от одного и того же базового класса (если нет, предоставьте классы адаптера, чтобы обойти разницу в интерфейсе), и используйте это. Я не уверен, что ссылка будет работать здесь, вам может понадобиться переменная-указатель, например:

    std :: istream * in = & get_event_stream ();

Затем заставьте ваши функции взять указатель на базовый класс (здесь std::istream) и использовать только те функции, которые имеет базовый класс:

void some_function( std::istream *in );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...