-
编写一个程序,定义一个名为
button
的类,表示GUI中的一个可点击按钮。 为该类加入两个方法add_handler()
和remove_handler()
,它们均要求一个函数名作为参数。 如果click()
方法被调用,已登记的函数将被按顺序执行。如下测试你的代码,创建一个
button
类的实例,从事件处理器内部向标准输出流写出一个信息。 调用click()
函数模拟用鼠标点击该按钮。
#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <memory>
#include <functional>
#include <vector>
#include <map>
#include <typeinfo>
class Button:
public boost::signals2::trackable
{
std::map<std::size_t, boost::signals2::connection> _connections;
public:
boost::signals2::signal<int (int ,int)> click;
void add_handler(std::function<int (int ,int)> func){
auto c = click.connect(func);
_connections.emplace(typeid(func).hash_code(), c );
}
void remove_handler(std::function<int (int ,int)> func){
_connections[typeid(func).hash_code()].disconnect();
}
};
int add(int a, int b){
std::cout<< "a = " << a << "b = "<< b << std::endl;
return a+b;
}
int main()
{
Button b;
b.add_handler(add);
b.click(1,1);
b.remove_handler(add);
b.click(1,1);
auto func2 = [](int a, int b){std::cout<<"a - b "<< "a = " << a << "b = "<< b << std::endl; return a - b;};
b.add_handler(func2);
b.click(2,1);
b.remove_handler(func2);
b.click(2,1);
}