安装
ReactiveX/RxCpp: Reactive Extensions for C++ (github.com)
在github下载源码,源码都是头文件,将 ~/Rx/v2/src/rxcpp 整个目录拷贝到工程目录,应用中包含头文件即可,无需编译库文件。
第一个程序

#include <iostream> #include <thread> #include <memory> #include <atomic> #include <chrono> #include "rxcpp/rx.hpp" namespace Rx { using namespace rxcpp; using namespace rxcpp::sources; using namespace rxcpp::operators; using namespace rxcpp::util; using namespace rxcpp::schedulers; } using namespace Rx; int main(int argc, char const *argv[]) { auto keys = observable<>::create<int>( [](subscriber<int> dest){ for (;;) { int key = std::cin.get(); if ('q' == key) { dest.on_completed(); break; } dest.on_next(key); } }); keys.subscribe([](int key){ std::cout << "User types key: " << (char)key << std::endl; }, [](){ std::cout << "User entered 'q' to exit." << std::endl; }); return 0; }
附上Makefile

CXXFLAGS += -I./ -std=c++11 SRC := $(wildcard ./*.cpp) OBJ := $(SRC:%.cpp=%.o) test_rxcpp: $(OBJ) $(CC) -o $@ $^ -lpthread -lm -ldl -lstdc++ strip $@ all: test_rxcpp clean: @rm -f test_rxcpp @rm -f $(OBJ)
运行结果:
s User types key: s User types key: g User types key: g User types key: t User types key: t User types key: q User entered 'q' to exit.
程序只是简单读取用户输入的字符并将它们一个个打印出来,直到用户输入'q',才退出。
它创建了一个被观察者keys,用于监控用户输入,并将输入数据发送出去,给后级的观察者,这里观察只是简单的打印一下接收到的字符。
这里为啥有字符没打印出来呢?那是个换行符,让我们来滤掉它:

keys.filter([](int key) { return key != '\n'; }).subscribe([](int key){ std::cout << "User types key: " << (char)key << std::endl; }, [](){ std::cout << "User entered 'q' to exit." << std::endl; });
运行结果:
sg User types key: s User types key: g r User types key: r t User types key: t q User entered 'q' to exit.
filter是RX中operator中的一种,返回true的数据才会被送到后一级。
若是有必要,它的后级还可以继续链上其他操作符,这样,数据就从被观察者,流经一系列过滤、转换等操作,最后被观察者所接收。
这种操作,以及其他operator我们将在后面的学习中接触到。
初接触这种编程方式,可能会一时难以适应。但没关系,学习新东西总有这么个过程。
网络上找到的关于RxCpp的资料不多,实用的更少,后续尽量多总结一下。
下面的两个链接,感觉对于理解反应性编程帮助挺大的,感谢作者的分享!
ReactiveX - 随笔分类 - zwvista - 博客园 (cnblogs.com)
以及官网文档