- 信号槽机制的原理
信号槽是观察者模式的一种实现,或者说是一种升华: - 一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知;
- 一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候——也可以说是信号发出的时候——被调用的函数;
- 你可以将信号和槽连接起来,形成一种观察者-被观察者的关系;
- 当事件或者状态发生改变的时候,信号就会被发出;同时,信号发出者有义务调用所有注册的对这个事件(信号)感兴趣的函数(槽);
- 信号和槽是多对多的关系,一个信号可以连接多个槽,而一个槽也可以监听多个信号;
信号槽机制是Qt的一大特性,Qt信号与槽机制降低了Qt对象的耦合度。但这种做法效率低,不灵活。
- 使用c++实现简单的信号槽机制
(1)信号模板类实现:
// CSignal.hpp
#ifndef _CSIGNAL_H
#define _CSIGNAL_H
#include <vector>
#include <memory>
#include <functional>
#include "CSlot.hpp"
#define emit
#define slots
#define signals public
#define connect(sender, signal, slot) ((sender)->signal.bind(slot))
template<typename... Args>
class Signal
{
public:
using SlotPtr = std::shared_ptr<Slot<Args&&...>>;
using OnFunc = std::function<void(Args&&...)>;
void bind(const OnFunc& func)
{
m_slotVec.push_back(