Rx cpp: Как мне повторить оператор OfType? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть класс:

class base_event;

Несколько классов происходят от него:

class event_1 : base_event;
class event_2 : base_event; 

У меня есть наблюдаемое:

observable<base_event> o;

Я бы хотел подписаться на o и получать события event_1 и event_2 отдельно.

o.of_type(event_1).subscribe([](event_1& e){});
o.of_type(event_2).subscribe([](event_2& e){});

Есть ли способ создать оператор of_type следующим образом?

1 Ответ

1 голос
/ 06 апреля 2020

Один из способов express of_type - использовать

o.filter([](const shared_ptr<base_event>& be){ 
  return dynamic_cast<event_1*>(be.get()) != nullptr;
})
.map([](const shared_ptr<base_event>& be){
  return static_pointer_cast<event_1>(be);
})

Другой - использовать

.map([](const shared_ptr<base_event>& be){
  auto event = dynamic_pointer_cast<event_1>(be);
  if (event == nullptr) { return empty<event_1>().as_dynamic();}
  return just<event_1>(event).as_dynamic();
})
.concat()

Я предпочитаю первый.

...