zoukankan      html  css  js  c++  java
  • C++ Boost 函数与回调应用

    #include <iostream>
    #include <string>
    #include <boostind.hpp>
    
    using namespace std;
    using namespace boost;
    
    int func(int x, int y)
    {
    	return x + y;
    }
    
    struct struct_func
    {
    	int func(int x, int y)
    	{
    		return x*y;
    	}
    };
    
    int main(int argc, char *argv[])
    {
    	// 绑定普通函数
    	auto ref = boost::bind(func, 20, 10)();
    	cout << "绑定调用: " << ref << endl;
    
    	// 绑定函数指针
    	typedef decltype(&func) f_type;
    	f_type ptr_a = func;
    	int x = 100, y = 200;
    	cout << "绑定调用: " << boost::bind(ptr_a, _1, _2)(x, y) << endl;
    	cout << "传入单参数: " << boost::bind(ptr_a, _1, 20)(10) << endl;
    
    	// 绑定成员函数
    	struct_func ptr_b;
    	auto struct_ref = boost::bind(&struct_func::func, ptr_b, _1, _2)(10, 10);
    	cout << "绑定调用: " << struct_ref << endl;
    
    	getchar();
    }
    

    function 参数绑定

    #include <iostream>
    #include <string>
    #include <boostfunction.hpp>
    #include <boostind.hpp>
    
    using namespace std;
    
    
    float MyFunc(int x, int y)
    {
    	return x + y;
    }
    
    struct MyStruct
    {
    	int add(int x, int y)
    	{
    		return x *y;
    	}
    };
    
    
    int main(int argc,char *argv[])
    {
    	// function 指向普通函数
    	boost::function<float(int, int)> function_ptr;
    
    	function_ptr = MyFunc;     // 将MyFunc用ptr来存储
    	if (function_ptr)
    	{
    		cout << "调用指针: " << function_ptr(10, 20) << endl;
    	}
    	function_ptr = 0;
    
    	// function 指向成员函数
    	boost::function<int(int, int)> struct_ptr;
    	MyStruct sc;
    
    	struct_ptr = boost::bind(&MyStruct::add,&sc, _1, _2);
    	cout <<"调用指针: " <<  struct_ptr(10, 20) << endl;
    	getchar();
    }
    

    ref库的使用

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boostind.hpp>
    #include <boostfunction.hpp>
    
    using namespace std;
    
    template<typename T>
    struct summary
    {
    	typedef void result_type;
    	T sum;
    
    	summary(T v = T()) : sum(v){}
    	void operator()(T const &x)
    	{
    		sum += x;
    	}
    };
    
    
    
    int main(int argc, char *argv[])
    {
    	vector<int> vect = { 1, 3, 5, 7, 9 };
    	summary<int> s;                        // 定义有状态函数对象
    
    	boost::function<void(int const&)> func(ref(s));   // function 包装引用
    
    	std::for_each(vect.begin(), vect.end(), func);
    	cout << "求和结果: " << s.sum << endl;
    
    	getchar();
    }
    

    使用普通回调函数

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boostind.hpp>
    #include <boostfunction.hpp>
    
    using namespace std;
    
    // 定义回调函数
    void call_back_func(int x)
    {
    	cout << "执行回调函数(数值翻倍): " << x * 2 << endl;
    }
    
    class MyClass
    {
    private:
    	typedef boost::function<void(int)> func_ptr;    // function 类型定义
    	func_ptr func;
    	int n;
    
    public:
    	// 定义构造函数
    	MyClass(int i) :n(i){}
    
    	// 存储回调函数
    	template<typename CallBack>
    	void accept(CallBack call)
    	{
    		func = call;
    	}
    	// 运行函数
    	void run()
    	{
    		func(n);
    	}
    };
    
    int main(int argc, char *argv[])
    {
    	MyClass ptr(10);
    
    	ptr.accept(call_back_func);    // 传入回调函数
    	ptr.run();
    
    	getchar();
    }
    

    带状态的回调函数,ref库传递引用

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boostind.hpp>
    #include <boostfunction.hpp>
    
    using namespace std;
    
    class MyClass
    {
    private:
    	typedef boost::function<void(int)> func_ptr;    // function 类型定义
    	func_ptr func;
    	int n;
    
    public:
    	// 定义构造函数
    	MyClass(int i) :n(i){}
    
    	// 存储回调函数
    	template<typename CallBack>
    	void accept(CallBack call)
    	{
    		func = call;
    	}
    	// 运行函数
    	void run()
    	{
    		func(n);
    	}
    };
    
    
    class call_back_obj
    {
    	private:
    		int x;
    
    	public:
    		call_back_obj(int i) :x(i){}
    		void operator()(int i)
    		{
    			cout << "回调函数: " << i * x << endl;
    		}
    };
    
    
    int main(int argc, char *argv[])
    {
    	MyClass ptr(10);
    	call_back_obj call_obj(2);
    
    	ptr.accept(ref(call_obj));
    
    	ptr.run();
    	ptr.run();
    
    	getchar();
    }
    

    通过类绑定多个callback

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boostind.hpp>
    #include <boostfunction.hpp>
    
    using namespace std;
    
    class MyClass
    {
    private:
    	typedef boost::function<void(int)> func_ptr;    // function 类型定义
    	func_ptr func;
    	int n;
    
    public:
    	// 定义构造函数
    	MyClass(int i) :n(i){}
    
    	// 存储回调函数
    	template<typename CallBack>
    	void accept(CallBack call)
    	{
    		func = call;
    	}
    	// 运行函数
    	void run()
    	{
    		func(n);
    	}
    };
    
    class call_back_factory
    {
    public:
    	void call_back_func_a(int x)
    	{
    		cout << "回调函数1: " << x * 2 << endl;
    	}
    
    	void call_back_func_b(int x, int y)
    	{
    		cout << "回调函数2: " << x * y << endl;
    	}
    };
    
    int main(int argc, char *argv[])
    {
    	MyClass ptr(10);
    	call_back_factory factory;
    
    	ptr.accept(bind(&call_back_factory::call_back_func_a, factory, _1));
    	ptr.run();
    
    	ptr.accept(bind(&call_back_factory::call_back_func_b, factory, _1, 200));
    	ptr.run();
    	getchar();
    }
    

    信号与槽 一个信号关联多个槽,信号发出后,槽函数相应。

    #include <iostream>
    #include <string>
    #include <boostsignals2.hpp>
    
    using namespace std;
    
    void slots_a()
    {
    	cout << "slots_a called" << endl;
    }
    
    void slots_b()
    {
    	cout << "slots_b called" << endl;
    }
    
    int main(int argc, char *argv[])
    {
    
    	// 简单的链接
    	boost::signals2::signal<void()> sig;    // 定义信号对象
    
    	sig.connect(&slots_a);
    	sig.connect(&slots_b);
    
    	sig();                  // 发射信号
    
    	getchar();
    }
    

    信号的返回值

    #include <iostream>
    #include <string>
    #include <boostsignals2.hpp>
    
    using namespace std;
    
    template<int T,int C>
    struct slots
    {
    	int operator()(int x)
    	{
    		return x + T + C;
    	}
    };
    
    int main(int argc, char *argv[])
    {
    
    	boost::signals2::signal<int(int)> sig;
    
    	// 0 代表组
    	sig.connect(0,slots<10,20>());
    
    	int ref = *sig(5);
    	cout << "获取返回值: " << ref << endl;
    
    	getchar();
    }
    

    合并器的使用

    #include <iostream>
    #include <string>
    #include <numeric>
    #include <boostsignals2.hpp>
    
    using namespace std;
    
    
    template<int T, int C>
    struct slots
    {
    	int operator()(int x)
    	{
    		return x + T + C;
    	}
    };
    
    
    template<typename T>
    class combiner
    {
    	T v;
    
    public:
    	typedef std::pair<T, T> result_type;
    	combiner(T t = T()) : v(t){}   // 构造函数
    
    	template<typename InputIterator>
    	result_type operator()(InputIterator begin, InputIterator end) const
    	{
    		// 为空则返回0
    		if (begin == end)
    			return result_type();
    
    		vector<T> vec(begin, end);  // 容器保存插槽调用结果
    
    		T sum = std::accumulate(vec.begin(), vec.end(), v);
    		T max = *std::max_element(vec.begin(), vec.end());
    
    		return result_type(sum, max);
    	}
    };
    
    int main(int argc, char *argv[])
    {
    	boost::signals2::signal<int(int), combiner<int>> sig;
    
    	sig.connect(0, slots<10, 20>());
    
    	auto x = sig(2);
    	cout << x.first << x.second << endl;;
    	getchar();
    }
    

    版权声明: 本博客,文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!
    如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品!
  • 相关阅读:
    express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(二)
    express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(一)
    [转载] 在阿里做了五年技术主管,我有话想说
    阿里云RDS MySql还原到本地Linux/Centos
    如何领域驱动设计?-实践感悟&总结分享
    jira + confluence 安装和破解
    RabbitMQ安装和配置
    [转]技术路线的选择重要但不具有决定性
    .Net core2.0日志组件Log4net、Nlog简单性能测试
    在微服务中使用领域事件
  • 原文地址:https://www.cnblogs.com/LyShark/p/14519748.html
Copyright © 2011-2022 走看看