c++ 如何在观测列表上使用RxCpp运算符?

xurqigkl  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(137)

我想在RxCpp观测值的列表/数组上使用zip运算符,但RxCpp运算符只接受可变参数,并且我的列表的大小是动态的(在运行时已知)。
有没有一种方法可以在一个可观测列表上使用这些操作符?提前感谢。

vpfxa7rd

vpfxa7rd1#

下面是一个简单的尝试,它迭代地压缩向量中的每个可观察值并累积结果:

  1. template <typename T>
  2. rxcpp::observable<std::shared_ptr<std::vector<T>>> zip_v(const std::vector<rxcpp::observable<T>>& observables) {
  3. // map the first observable to convert values to a single-element vector
  4. auto it = observables.cbegin();
  5. rxcpp::observable<std::shared_ptr<std::vector<T>>> acc = it->map([](T t) {
  6. return std::make_shared<std::vector<T>>(std::initializer_list<T>{ t });
  7. });
  8. // fold each observable into accumulator by zipping, and pushing back value
  9. while (++it != observables.cend()) {
  10. acc = acc.zip([](std::shared_ptr<std::vector<T>> acc, T next) {
  11. acc->push_back(next);
  12. return acc;
  13. }, *it);
  14. }
  15. return acc;
  16. }

字符串
使用示例:

  1. std::vector<rxcpp::observable<int>> sources{
  2. rxcpp::observable<>::range(1, 5),
  3. rxcpp::observable<>::range(6, 10),
  4. rxcpp::observable<>::range(11, 15)
  5. };
  6. zip_v(sources).
  7. take(3).
  8. subscribe(
  9. [](auto vs){
  10. for (auto& v : *vs) {
  11. printf("%d ", v);
  12. }
  13. printf("\n");
  14. },
  15. [](){ printf("complete\n"); });


输出量:

展开查看全部
swvgeqrz

swvgeqrz2#

在RxCpp的GitHub页面上发布这个问题后,我被建议使用iterate函数,尽管它仍然不支持动态参数。

  1. std::array< rxcpp::observable<int>, 3 > a={{rxcpp::just(1), rxcpp::just(2), rxcpp::just(3)}};
  2. auto values = rxcpp::observable<>::iterate(a);
  3. values.
  4. merge().
  5. subscribe(
  6. [](int v){printf("OnNext: %d\n", v);},
  7. [](){printf("OnCompleted\n");});

字符串

相关问题