template <class M> void Subscribe<M>::registerRecvFunc(std::function<void(const M &)> func) { m_recv_func = func; }
时间: 2024-06-04 07:09:15 浏览: 231
这段代码是一个模板类 `Subscribe` 的方法 `registerRecvFunc` 的定义。
这个方法接受一个 `std::function` 类型的参数 `func`,它表示一个回调函数,当 `Subscribe` 对象接收到特定类型的消息时,会调用该回调函数进行处理。
在方法内部,将回调函数赋值给 `m_recv_func` 成员变量,以便后续使用。`m_recv_func` 是一个模板类型参数 `M` 对应的函数指针,它负责处理接收到的消息。
相关问题
c++ 写一个消息订阅器class,根据消息类型type,绑定对应函数std::function,再有内部的线程对消息type进行分发到对应的函数
在C++中,你可以创建一个名为`MessageSubscriber`的类,用于订阅不同类型的消息并调用对应的函数。这里是一个简单的例子:
```cpp
#include <iostream>
#include <thread>
#include <map>
#include <functional>
class MessageSubscriber {
public:
// 增加消息订阅
template<typename Func, typename T>
void subscribe(const std::string& type, Func&& func) {
message_map_[type] = std::bind(func, this);
}
// 发布消息并分发到对应函数
void publish(T message, const std::string& type) {
if (message_map_.find(type) != message_map_.end()) {
auto bound_func = message_map_[type];
std::invoke(bound_func, message); // 使用std::invoke避免捕获this
}
}
private:
std::map<std::string, std::function<void(T)>> message_map_;
};
// 示例:订阅和发布消息
int main() {
MessageSubscriber subscriber;
// 订阅消息类型为"hello"
subscriber.subscribe<std::function<void(int)>,"hello", [](int num) { std::cout << "Received hello message with number: " << num << std::endl; });
// 发布消息
int message = 123;
subscriber.publish(message, "hello");
return 0;
}
```
在这个例子中,`subscribe`方法接受一个类型参数`T`和一个函数模板`Func`,然后将`func`绑定到特定的消息类型上。当`publish`方法接收到相应类型的消息时,会从映射中找到相应的函数并执行。
注意,为了防止回调函数修改`subscriber`实例的成员,我们在`publish`中使用了`std::invoke`,而不是直接传递`this`给`bound_func`。
阅读全文