我想在RxCpp观测值的列表/数组上使用zip运算符,但RxCpp运算符只接受可变参数,并且我的列表的大小是动态的(在运行时已知)。有没有一种方法可以在一个可观测列表上使用这些操作符?提前感谢。
vpfxa7rd1#
下面是一个简单的尝试,它迭代地压缩向量中的每个可观察值并累积结果:
template <typename T>rxcpp::observable<std::shared_ptr<std::vector<T>>> zip_v(const std::vector<rxcpp::observable<T>>& observables) { // map the first observable to convert values to a single-element vector auto it = observables.cbegin(); rxcpp::observable<std::shared_ptr<std::vector<T>>> acc = it->map([](T t) { return std::make_shared<std::vector<T>>(std::initializer_list<T>{ t }); }); // fold each observable into accumulator by zipping, and pushing back value while (++it != observables.cend()) { acc = acc.zip([](std::shared_ptr<std::vector<T>> acc, T next) { acc->push_back(next); return acc; }, *it); } return acc;}
template <typename T>
rxcpp::observable<std::shared_ptr<std::vector<T>>> zip_v(const std::vector<rxcpp::observable<T>>& observables) {
// map the first observable to convert values to a single-element vector
auto it = observables.cbegin();
rxcpp::observable<std::shared_ptr<std::vector<T>>> acc = it->map([](T t) {
return std::make_shared<std::vector<T>>(std::initializer_list<T>{ t });
});
// fold each observable into accumulator by zipping, and pushing back value
while (++it != observables.cend()) {
acc = acc.zip([](std::shared_ptr<std::vector<T>> acc, T next) {
acc->push_back(next);
return acc;
}, *it);
}
字符串使用示例:
std::vector<rxcpp::observable<int>> sources{ rxcpp::observable<>::range(1, 5), rxcpp::observable<>::range(6, 10), rxcpp::observable<>::range(11, 15) }; zip_v(sources). take(3). subscribe( [](auto vs){ for (auto& v : *vs) { printf("%d ", v); } printf("\n"); }, [](){ printf("complete\n"); });
std::vector<rxcpp::observable<int>> sources{
rxcpp::observable<>::range(1, 5),
rxcpp::observable<>::range(6, 10),
rxcpp::observable<>::range(11, 15)
};
zip_v(sources).
take(3).
subscribe(
[](auto vs){
for (auto& v : *vs) {
printf("%d ", v);
printf("\n");
},
[](){ printf("complete\n"); });
型输出量:
swvgeqrz2#
在RxCpp的GitHub页面上发布这个问题后,我被建议使用iterate函数,尽管它仍然不支持动态参数。
std::array< rxcpp::observable<int>, 3 > a={{rxcpp::just(1), rxcpp::just(2), rxcpp::just(3)}};auto values = rxcpp::observable<>::iterate(a);values. merge(). subscribe( [](int v){printf("OnNext: %d\n", v);}, [](){printf("OnCompleted\n");});
std::array< rxcpp::observable<int>, 3 > a={{rxcpp::just(1), rxcpp::just(2), rxcpp::just(3)}};
auto values = rxcpp::observable<>::iterate(a);
values.
merge().
[](int v){printf("OnNext: %d\n", v);},
[](){printf("OnCompleted\n");});
字符串
2条答案
按热度按时间vpfxa7rd1#
下面是一个简单的尝试,它迭代地压缩向量中的每个可观察值并累积结果:
字符串
使用示例:
型
输出量:
swvgeqrz2#
在RxCpp的GitHub页面上发布这个问题后,我被建议使用iterate函数,尽管它仍然不支持动态参数。
字符串