RXcpp поток данных из функции непрерывно

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

int Engine::Initialize()
{
al_init();

display = al_create_display(1200, 800);

eventQueue = al_create_event_queue();

al_install_mouse();
al_install_keyboard();

al_register_event_source(eventQueue, al_get_keyboard_event_source());
al_register_event_source(eventQueue, al_get_mouse_event_source());

//test: wait for 2 events to happen
auto events = rxcpp::observable<>::create([](rxcpp::subscriber<ALLEGRO_EVENT> e)
{
e.on_next(WaitForEvent);
e.on_next(WaitForEvent);
e.on_completed();
});

events.subscribe([](ALLEGRO_EVENT e)
{
printf("We have an Event: %d \n", e.type);
},

[]()
{
printf("Done\n");
});

return 0;
}

ALLEGRO_EVENT Engine::WaitForEvent()
{
ALLEGRO_EVENT event;

al_wait_for_event(eventQueue, &event);

return event;
}

Кажется, я получаю ошибку: ни один экземпляр шаблона функции «rxcpp :: observable :: create» не соответствует списку аргументов. Нужно ли мне делать свой собственный шаблон или что-то такое, чтобы иметь возможность наблюдать ALLEGRO_EVENT?

1

Решение

От документы, это выглядит как create использует явный параметр шаблона для возвращаемого типа, поэтому вам нужно предоставить его. Ваш слушатель ничего не возвращает, поэтому void должно сработать.

auto events = rxcpp::observable<>::create<void>(...
0

Другие решения

У @tim была правильная идея.

Я выкладываю ответ от нашего обсуждение

create<>() должен знать тип, который будет передан on_next(),
К тому же, WaitForEvent это функция, но on_next() ожидает ALLEGRO_EVENT поэтому обязательно позвоните WaitForEvent() и передать результат on_next()

auto events = rxcpp::observable<>::create<ALLEGRO_EVENT>([this](rxcpp::subscriber<ALLEGRO_EVENT> e)
{
e.on_next(this->WaitForEvent());
e.on_next(this->WaitForEvent());
e.on_completed();
});
0

По вопросам рекламы [email protected]