c++ stdfuntion 实现信号槽
时间: 2023-06-05 16:47:25 浏览: 80
std::function是一个C++11标准库中的模板类,可以包装任意类型的可调用对象(函数、函数指针、lambda表达式等),使其可以像普通函数一样进行调用,具有更大的灵活性和可扩展性。
在实现信号槽的时候,可以使用std::function来包装信号和槽,将信号与槽关联在一起,实现信号与槽之间的通信连接。
示例代码如下:
```
#include <functional>
#include <iostream>
using namespace std;
class MySignal {
public:
// 声明信号的类型为std::function<void()>
typedef std::function<void()> SignalType;
// 构造函数,初始化信号为nullptr
MySignal() : m_signal(nullptr) {}
// 设置信号
void setSignal(SignalType signal) {
m_signal = signal;
}
// 发送信号
void emitSignal() {
if (m_signal) {
m_signal();
}
}
private:
SignalType m_signal; // 信号
};
class MySlot {
public:
// 声明槽的类型为std::function<void(int)>
typedef std::function<void(int)> SlotType;
// 构造函数,初始化槽为nullptr
MySlot() : m_slot(nullptr) {}
// 设置槽
void setSlot(SlotType slot) {
m_slot = slot;
}
// 槽函数,接收信号传递的参数并进行处理
void handleSignal(int value) {
if (m_slot) {
m_slot(value);
}
}
private:
SlotType m_slot; // 槽
};
int main() {
MySignal signal;
MySlot slot;
// 将信号与槽关联起来
// 信号为无参函数,槽为接收一个int类型参数的函数
signal.setSignal(std::bind(&MySlot::handleSignal, &slot, std::placeholders::_1));
slot.setSlot([](int value) { cout << "MySlot received signal with value: " << value << endl; });
// 发送信号,槽函数会接收到传递的参数并进行处理
signal.emitSignal();
return 0;
}
```
在上述代码实现中,使用std::function实现了信号与槽的关联。在信号MySignal中,以std::function<void()>的类型声明了信号的类型,并将其作为成员变量m_signal保存;在槽MySlot中,以std::function<void(int)>的类型声明了槽的类型,并将其作为成员变量m_slot保存。在将信号与槽关联起来时,利用std::bind函数传递槽函数指针以及它需要的参数,并将返回值作为信号的回调函数。当信号emit时,会调用它关联的槽函数,并将参数传递给槽函数。
通过以上代码实现,我们可以看到使用std::function和bind函数可以非常方便的实现信号和槽之间的连接。同时,由于其灵活性和可扩展性,它也被广泛应用于各种场景中,如事件驱动编程、函数回调等。