boost库的signals使用和sprintf,printf使用

使用sprintf把各个类型转成char*(long long, doule,int)

https://it1995.blog.csdn.net/article/details/90582580?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control

How do you format an unsigned long long int using printf?

https://stackoverflow.com/questions/2844/how-do-you-format-an-unsigned-long-long-int-using-printf

int printf(const char *format [, argument]...);

int sprintf(char *buffer, const char *format [, argument] ...);

  • 函数printf(...)根据指定的格式(format)将参数(argument)输出到屏幕上;

  • 函数sprintf(...)根据指定的格式(format)将参数(argument)输出到由指针buffer指定的字符数组(字符缓冲区)中;


signals的使用其实就是实现了观察者模式。

两个关键词:signal 和 slots ——信号插槽

信号其实就是Subject,插槽就是Observer

给信号连接上插槽,然后信号一触发,插槽上的函数就一触即发。

一个简单的使用signal和slots的例子:

1.先定义一个函数对象HelloWorld

(函数对象就是实现了operator()操作符的类)

struct HelloWorld 
{
        void operator()() const 
       { 
             std::cout << "Hello, World!" << std::endl;
       } 
};

2.定义信号signal类型的变量 sig 

boost::signal<返回值 + 输入参数>

boost::signal<void ()> sig;

3.使用connect方法

connect的作用是将一个函数对象实例hello,连接到sig。如下:

HelloWorld hello;
sig.connect(hello);

也可以用

sig.connect(HelloWorld());   // 调用HelloWord的默认构造函数  构造了一个HelloWord对象实例

上述的hello即为连接到signal的一个slot

  • slot除了可以是函数对象,也可以是函数指针:
void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}
boost::signal<void (float, float)> sig;

sig.connect(&print_sum);

sig(5, 3);
  • 一个signal可以连接多个slot

多个slot也可以是相同的。顺序一般先进先调用,但是也有可能有副作用。

void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}
boost::signal<void (float, float)> sig;

sig.connect(&print_sum);
sig.connect(&print_sum);
sig(5, 3);

如果对调用顺序有严格的要求,可以调用下面这个重载函数进行connect,增加要给参数groupname,int类型的,值越小,越早调用。

connect(groupname,slot)

4.调用sig

即调用连接到自己的slots——即hello。

sig();

5.断开连接

一般slot不会永久得连接到signal,一般slot用来连接过一些事件以后就会进行断开连接。例如:

void foo();
void bar();

signal<void()> sig;

sig.connect(&foo);
sig.connect(&bar);

// disconnects foo, but not bar
sig.disconnect(&foo);

注意:函数对象的断开,需要函数对象的类型具有可访问的==运算符,即可以使用disconnect方法的形式断开与给定函数对象等效的槽。

参考

https://www.boost.org/doc/libs/1_61_0/doc/html/signals/tutorial.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值