boost教程(四):事件处理

每一部分都单独注释的,运行时取消注释,将其他部分注释起来就可以。

第一部分 :信号

#include <boost/signals2.hpp> 
/*

Boost.Signals 定义了其它一些类,位于 boost::signals 名字空间中。 
由于 boost::signal 是最常被用到的类,所以它是位于名字空间 boost 中的。
*/


#include <iostream> 
#include "boost/function.hpp"
#include <algorithm> 
#include <boost/optional/optional_io.hpp>
#include <vector>

void func()
{
	std::cout << "Hello, world!" << std::endl;
}


void func1()
{
	std::cout << "Hello" << std::flush;
}

void func2()
{
	std::cout << ", world!" << std::endl;
}

int func3()
{
	return 1;
}

int func4()
{
	return 2;
}

//返回值合成器,重载了operator()() ,返回最小值,
template <typename T>
struct min_element
{
	typedef T result_type;

	template <typename InputIterator>
	T operator()(InputIterator first, InputIterator last) const
	{
		return *std::min_element(first, last);
	}
};

//合成器保存结果
template <typename T>
struct element
{
	typedef T result_type;

	template <typename InputIterator>
	T operator()(InputIterator first, InputIterator last) const
	{
		return T(first, last);
	}
};


int test0()
{
	只有签名为 void () 的函数可以被成功关联至信号 s。
	//boost::signals2::signal<void()> s;
	函数的签名对应于作为模板参数传入的签名:因为 void () 不要求任何参数,所以括号内是空的。
	//s.connect(func);
	//s();



	//和前一个例子相类似,func() 被关联至 f。 当 f 被调用时,就会相应地执行 func()。 
	/*boost::function<void()> f;
	f = func;
	f();*/


	/*
	Boost.Signals 则提供了多得多的方式,如关联多个函数至单个特定信号,示例如下。

	*/
	/*boost::signals2::signal<void()> s;
	s.connect(func1);
	s.connect(func2);
	s();*/


	/*
	 当该信号被触发时,这些函数被按照之前用 connect() 进行关联时的顺序来执行。
	执行的顺序也可通过 connect() 方法的另一个重载版本来明确指定,
	该重载版本要求以一个 int 类型的值作为额外的参数。
	*/
	/*boost::signals2::signal<void()> s;
	s.connect(1,func2);
	s.connect(0,func1);*/
	//释放函数
	//s.disconnect(func2);
	//关联函数的数量
	//std::cout << s.num_slots() << std::endl;
	//if (!s.empty())
	//	s();
	释放所有函数
	//s.disconnect_all_slots();
	
	

	/*
	#include <boost/optional/optional_io.hpp>
	//缺省情况下,所有被关联函数中,实际上只有最后一个返回值被返回。
	*/
	/*boost::signals2::signal<int()> s;
	s.connect(func3);
	s.connect(func4);
	std::cout << s() << std::endl;*/


	//用合成器返回最小值
	/*boost::signals2::signal<int(),min_element<int>> s;
	s.connect(func3);
	s.connect(func4);
	std::cout << s() << std::endl;
*/

	//将结果保存在vector中
	boost::signals2::signal<int(), element<std::vector<int>>> s;
	s.connect(func3);
	s.connect(func4);
	std::vector<int> v = s();

	system("pause");
	return 0;
}

第二部分:连接

#include <boost/signals2.hpp> 
#include <iostream>

#include"boost/signals2/signal.hpp"
#include <boost/bind.hpp>
#include <memory>


void func5()
{
	std::cout << "Hello, world!" << std::endl;
}

class world
{
public:
	void hello() const
	{
		std::cout << "Hello, world!" << std::endl;
	}
};

class world1 :
	public boost::signals2::trackable
{
public:
	void hello() const
	{
		std::cout << "Hello, world!" << std::endl;
	}
};

int main()
{
	boost::signals2::signal<void()> s;
	/*
	函数可以通过由 boost::signals2所提供的 connect() 和 disconnect() 方法的帮助来进行管理。
	 connect() 会返回一个类型为boost::signals2::connection 的值,它们可以通过其它方法来管理。
	*/
	//boost::signals2::connection c = s.connect(func5);
	//boost::signals2::shared_connection_block cb(c);
	阻塞
	//cb.block();
	//s();
	打开阻塞
	//cb.unblock();
	//s();
	c.disconnect();



	//{
	//	//它会在析构时自动释放连接。所以不会执行下面的
	//boost::signals2::scoped_connection c = s.connect(func5);
	//}
	//s();




	//{
	//	// 在 s() 被实际调用的时候,该指针所引向的对象已不再存在。
	//	//但是还在往下执行
	//	std::auto_ptr<world> w(new world());
	//	s.connect(boost::bind(&world::hello,w.get()));
	//}

	//std::cout << s.num_slots() << std::endl;
	//s();





	//修改这个程序,使得一旦对象 w 被销毁,连接就会自动释放。

	{
		std::auto_ptr<world1> w(new world1());
		s.connect(boost::bind(&world1::hello, w.get()));
	}
	/*
	num_slots() 会返回 0 以确保不会试图调用已销毁对象之上的方法。
	仅需的修改是让 world 类继承自 boost::signals::trackable。
	*/
	std::cout << s.num_slots() << std::endl;
	s();




	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值