manipulador de serviço asio para keypress stdin

Eu adapteipasso 3 do tutorial Boost asio para executar para sempre e exibir "tick" e "tock" uma vez por segundo em vez do contador:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void print(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* t, int* count)
{
    if( !((*count) % 2) )
        std::cout << "tick\n";
    else
        std::cout << "tock\n";

    ++(*count);

    t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
    t->async_wait(boost::bind(print,
          boost::asio::placeholders::error, t, count));
}

int main()
{
  boost::asio::io_service io;

  int count = 0;
  boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
  t.async_wait(boost::bind(print,
        boost::asio::placeholders::error, &t, &count));

  io.run();

  std::cout << "Final count is " << count << "\n";

  return 0;
}

Agora quero assíncrona ser capaz de manipular um pressionamento de tecla em stdin. Existe um manipulador de io_service que eu possa usar para responder a pressionamentos de tecla, sem bloquear suspensões ou esperas?

Por exemplo, gostaria de poder implementar uma função de manipulador semelhante a:

void handle_keypress(const boost::error_code&,
    char c)
{
    std::cout << "Tap '" << c << "'\n";
}

E eu esperaria que minha invocação desse manipulador fosse algo como:

  char c = 0;
  boost::asio::stdin_receiver sr(io);
  st.async_wait(boost::bind(handle_keypress, boost::asio::placeholders::error, &c));

  io.run();

Isso é algo que eu posso fazer com o asio, usando um manipulador de serviço interno ou escrevendo o meu próprio?

EDITAR, ELABORAÇÃO:

Eu tenho vistoessa questão, mas o código vinculado na resposta aceita simplesmente faz issomain:

 while (std::cin.getline(

O aplicativo que estou escrevendo não é esse simples dispositivo tick-tock-tap que descrevi acima, mas será um servidor multicast. Vários threads de trabalho estarão enviando pacotes para grupos multicast, respondendo a mensagens do thread principal e enviando mensagens de volta ao thread principal. O aplicativo, por sua vez, será "acionado" pela entrada do stdin - por exemplo, quando o usuário pressiona a tecla "P", a transmissão multicast será pausada, e quando o hit "Q" a coisa toda for desligada . No thread principal, tudo o que farei em resposta a essas entradas é enviar mensagens para os threads de trabalho.

owhile O loop acima não funcionará no meu cenário porque, enquanto ele aguarda a entrada stdin do usuário, o thread principal não poderá processar mensagens vindas dos threads de trabalho. Algumas dessas mensagens do thread de trabalho irão gerar saída para stdout.

questionAnswers(2)

yourAnswerToTheQuestion