C++ Boost 函数与回调应用
#include <iostream>
#include <string>
#include <boost\bind.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 <boost\function.hpp>
#include <boost\bind.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 <boost\bind.hpp>
#include <boost\function.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 <boost\bind.hpp>
#include <boost\function.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 <boost\bind.hpp>
#include <boost\function.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 <boost\bind.hpp>
#include <boost\function.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 <boost\signals2.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 <boost\signals2.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 <boost\signals2.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();
}
C++ Boost 函数与回调应用的更多相关文章
- boost 函数与回调
result_of 含义:result_of可以帮助程序员确定一个调用表达式的返回类型,主要用于泛型编程和其他boost库组件,它已经被纳入TR1 头文件:<boost/utility/resu ...
- php变量函数,回调函数
一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 { for($i=0;$i<$num;++$i) { if($n($i)) { e ...
- paip.函数方法回调机制跟java php python c++的实现
paip.函数方法回调机制跟java php python c++的实现 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- C++中类成员函数作为回调函数
注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是 ...
- Go基础系列:函数(2)——回调函数和闭包
回调函数和闭包 当函数具备以下两种特性的时候,就可以称之为高阶函数(high order functions): 函数可以作为另一个函数的参数(典型用法是回调函数) 函数可以返回另一个函数,即让另一个 ...
- 精读JavaScript模式(五),函数的回调、闭包与重写模式
一.前言 今天地铁上,看到很多拖着行李箱的路人,想回家了. 在上篇博客结尾,记录到了函数的几种创建方式,简单说了下创建差异,以及不同浏览器对于name属性的支持,这篇博客将从第四章函数的回调模式说起. ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数
线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...
- Javascript中的回调函数和匿名函数的回调
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Node.js学习笔记(3)——关于回调函数和函数的回调
说明:本人是node.js的初学者,尝试向别人解释这是怎么回事是自我学习的一个好方法.如果你发现有些地方并不是那么正确,欢迎提出来让我知道以便修正,共同进步,谢过^_^. 欢迎交流,本人微 ...
- Javascript中的回调函数和匿名函数的回调示例介绍
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- c中常用的字符串操作
c中常用的字符串操作 头文件:<string.h> 1.strchr()查找某字符在字符串中首次出现的位置 strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char ...
- OS | 文件系统总结
文件系统总结 逻辑文件面向用户,学习时应该掌握不同的逻辑文件之间的特点 目录文件时链接逻辑文件和物理文件的桥梁,学习时应该体会到目录文件时如何优化访问时间 物理文件是指文件的数据如何存储在磁盘等存储设 ...
- POJ 3268 Silver Cow Party 题解 《挑战程序设计竞赛》
POJ 3268 Silver Cow Party 奶牛派对:有分别来自 N 个农场的 N 头牛去农场 X 嗨皮,农场间由 M 条有向路径连接.每头牛来回都挑最短的路走,求它们走的路的最大长度? 们其 ...
- JSP使用MySQL数据库报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
错误 在JavaWeb中的JSP中使用MySQL数据库报错找不到 com.mysql.jdbc.Driver . 错误日志如下: java.lang.ClassNotFoundException: c ...
- AtCoder Beginner Contest 178 个人题解(C组合问题 + 快速幂,D规律,E数学公式变形)
补题链接:Here A - Not Editorial 给出 \(x = 1\) 则输出 0:给出 \(x = 0\) 则输出 1 利用 x ^ 1 可以快速实现 \(x\) 的转换 B - Prod ...
- L2-008 最长对称子串 (回文子串 / DP / Manacher算法)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 阿里云 X 森马 AIGC T恤设计大赛开启! 穿什么由你定,赢Airpods,作品定制联名T恤
"关于宇宙,我所知道的最富诗意的事实之一就是, 我们身体中的每一个原子都曾经存在于某一颗爆发的恒星里. 组成你左手的原子和组成你右手的原子 很有可能来自不同的恒星, 而我们都是恒星的孩子, ...
- C#之RabbitMQ
本文内容整理自https://blog.csdn.net/by_ron/category_6167618.html RabbitMQ–环境搭建 能点进来相信你明白RabbitMQ是干什么的了,这个系列 ...
- 【面试题精讲】你知道MySQL中有哪些隔离级别吗
有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 脏读(Dirty Read)是指一个事务读取到了另一 ...
- [转帖]两种Nginx日志切分方案,狼厂主要在用第1种
两种Nginx日志切分方案,狼厂主要在用第1种 nginx的日志切分问题一直是运维nginx时需要重点关注的.本文将简单说明下nginx支持的两种日志切分方式. 一.定时任务切分 所谓的定时任务切分, ...