sig/slot

2014-06-28 星期六 18:44:51 

开源的有

libsigc++,

简单代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

#include <algorithm>

#include <iostream>

#include <vector>

#include <stdio.h>

/*

Slot        一个对象和其对应的pfunc

Signal  媒介,保存Slot Node

emitter "知晓"(一般是聚合)Signal并发起Signal

*/

using namespace std;

template<typename T1>

class SlotBase

{

public:

    virtual void Exec(T1 param1) = 0;

};

template<typename T, typename T1>

class SlotImpl : public SlotBase<T1>

{

public:

    SlotImpl(T* pObj, void (T::*func)(T1))

    {

        m_pObj = pObj;

        m_Func = func;

    }

    void Exec( T1 param1)

    {

        (m_pObj->*m_Func)(param1);

    }

private:

    T* m_pObj;

    void (T::*m_Func)(T1);

};

//node

template<typename T1>

class Slot

{

public:

    template<typename T>

    Slot(T* pObj, void (T::*func)(T1))

    {

        m_pSlotBase = new SlotImpl<T,T1>(pObj, func);

    }

    ~Slot()

    {

        delete m_pSlotBase;

    }

    void Exec(T1 param1)

    {

        m_pSlotBase->Exec(param1);

    }

private:

    SlotBase<T1>* m_pSlotBase;

};

//veteor <node> m_node

template<typename T1>

class Signal

{

public:

    template<typename T>

    void Bind(T* pObj, void (T::*func)(T1))

    {

        m_pSlotSet.push_back( new Slot<T1>(pObj,func) );

    }

    ~Signal()

    {

        for(int i=0;i<(int)m_pSlotSet.size();i++)

        {

            delete m_pSlotSet[i];

        }

    }

    //Functor

    void operator()(T1 param1)

    {

        for(int i=0;i<(int)m_pSlotSet.size();i++)

        {

            m_pSlotSet[i]->Exec(param1);

        }

    }

private:

    vector< Slot<T1>* > m_pSlotSet;

};

#define Connect( sender, signal, receiver, method) ( (sender)->signal.Bind(receiver, method) )

class CRecv0

{

public:

    void FuncRecv0(int param)

    {

        printf("CRecv0::FuncRecv0(%d)\n", param);

    }

};

class CRecv1

{

public:

    void FuncRecv1(int param)

    {

        printf("CRecv1::FuncRecv1(%d)\n", param);

    }

};

//emitter

class CEmit

{

public:

    CEmit()

    {

        m_Value = 0;

    }

    void EmitValue(int value)

    {

        if(m_Value != value)

        {

            m_Value = value;

            SigValue(m_Value);

        }

    }

    

public:

    Signal<int> SigValue;

private:

    int m_Value;

};

int main()

{

    CRecv0* pRecv0 = new CRecv0;

    CRecv1* pRecv1 = new CRecv1;

    CEmit*  pEmit  = new CEmit;

    Connect(pEmit, SigValue, pRecv0, &CRecv0::FuncRecv0);

    Connect(pEmit, SigValue, pRecv1, &CRecv1::FuncRecv1);

    pEmit->EmitValue(10);

    pEmit->EmitValue(5);

    pEmit->EmitValue(2);

    delete pEmit;

    delete pRecv0;

    delete pRecv1;

    return 0;

}

另一个libjingel中的signal/slot,分析见http://my.oschina.net/tianxialangui/blog/67005

demo如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

#include <iostream>

#include "sigslot_libjingle.h"

using namespace sigslot;

#if 1

struct dog

{

    signal1<std::string &> bark;

    void beaten()

    {

        std::string w = "wangwangwang";

        bark(w); // 娑堟伅浜х敓

    }

};

struct human : public has_slots<>

{

    void action0(std::string &w)

    {

       std::cout << "action0:" << w.c_str() << std::endl;

    }

     

    void action1(std::string &w)

    {

       std::cout << "action1:" << w.c_str() << std::endl;

    }

};

int main()

{

    dog d;

    human man;

    d.bark.connect(&man, &human::action0);

    //d.beaten();

  

    d.bark.connect(&man, &human::action1);

    std::string w0 = "www0";

    d.bark(w0);

    std::string w1 = "www1";

    //emit all

    //d.bark.emit(w);

    d.bark(w1);

    

    d.bark.disconnect(&man);

    return 0;

}

#endif

这个的耦合度基本为零。

来自为知笔记(Wiz)

时间: 2024-08-02 03:37:20

sig/slot的相关文章

peer-connection - ICE

webrtc点对点会话建立过程:https://blog.csdn.net/zhuiyuanqingya/article/details/84108763 本地Candidate收集 本地的IceCandidate收集过程起始于PeerConnection::SetLocalDescription,其中会启动收集 // MaybeStartGathering needs to be called after posting // MSG_SET_SESSIONDESCRIPTION_SUCCES

Vue内容分发slot

前面的话 为了让组件可以组合,需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 “transclusion” ).Vue实现了一个内容分发 API,参照了当前 Web 组件规范草案,使用特殊的 <slot> 元素作为原始内容的插槽.本文将详细介绍Vue内容分发slot 编译作用域 在深入内容分发 API 之前,先明确内容在哪个作用域里编译.假定模板为 <child-component> {{ message }} </child-compone

Vue学习笔记入门篇——组件的内容分发(slot)

本文为转载,原文:Vue学习笔记入门篇--组件的内容分发(slot) 介绍 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 "transclusion" 如果你熟悉 Angular).Vue.js 实现了一个内容分发 API,使用特殊的 'slot' 元素作为原始内容的插槽. 编译作用域 在深入内容分发 API 之前,我们先明确内容在哪个作用域里编译.假定模板为: <child-component> {{ messa

vue.js 中slot 用处大(转载)

什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. Slot分发内容 ①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下 父组件在子组件内套的内容,是不显示的. 例如代码: <

分享vue中 slot用法

//slot默认用法 //slot带参数name用法

实现signal和slot机制(2)-跨线程投递

前言 在1中,我们实现了一个基础的signal+slot的模块件调用机制,不过那个direct调用,在这篇中,我们将支持夸线程调用,即在对象的线程上下文中,调用对象的函数. 对象线程绑定 在qt中,有一个很重要的概念,对象线程绑定,即在每个对象实例时候,其保存其线程上下文信息,其中就有一个事件循环,跨线程的信号就是将这个一个task丢到这个事件循环中,在对象绑定的线程中完成slot响应. 实现 对slot调用的打包-Task 我们需要将一个跨线程的slot调用打包成一个task,然后丢到想相应的

sigslot,一个开源的c++signal slot库

sigslot is a head only signal slot lib,written by Sarah Thompson. 原始仓库是 http://sourceforge.net/projects/sigslot/ 文档是 http://sigslot.sourceforge.net/sigslot.pdf a Patched version of Sarah Thompson's sigslot implementation. Works with VS 2013 on Window

Android驱动之 Linux Input子系统之TP——A/B(Slot)协议

utm_source=tuicool&utm_medium=referral">点击打开链接 将A/B协议这部分单独拿出来说一方面是由于这部分内容是比較easy忽视的.周围大多数用到input子系统的开发者也不甚理解.还有一方面是由于这部分知识一旦扩展到TP(触摸屏Touch Panel)的多点触摸就要与Middleware/Framework一起结合起来看才干全然掌握,复杂性所在. 这里的Middleware/Framework是针对android来说的,本人从事android这

求助LTE专家:LTE中TTI,subframe,slot

提问者:asenfanbo  |  提问时间:2016-10-27 20:29 LTE中TTI,subframe,slot的具体物理含义是什么,每个的物理含义是什么以及3GPP为什么要定义这三个单位(PS:不要告诉我TTI=subframe=2slot,我不是在问时间长短关系哈) 问题补充:2016-11-1 20:13没人回答,我自己来答吧.TTI,subframe和slot在LTE中虽然都是时间单位,但物理意义确实不一样的.TTI是一次传输的时间长度或传输间隔时间,slot是调度的粒度.即一