std::bind
参考资料
• cplusplus.com:http://www.cplusplus.com/reference/functional/bind/
• cppreference.com:http://en.cppreference.com/w/cpp/utility/functional/bind
std::bind简介
• 函数模板声明
// cplusplus.com
// simple(1)
template <class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args); // with return type (2)
template <class Ret, class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args); // GCC 4.8.2 - /usr/include/c++/4.8.2/tr1
template <typename _Functor, typename... _ArgTypes>
inline _Bind<typename _Maybe_wrap_member_pointer<_Functor>::type(_ArgTypes...)>
bind(_Functor __f, _ArgTypes... __args)
{
...
} template <typename _Result, typename _Functor, typename... _ArgTypes>
inline _Bind_result<_Result, typename _Maybe_wrap_member_pointer<_Functor>::type (_ArgTypes...)>
bind(_Functor __f, _ArgTypes... __args)
{
...
} // MS C++ 2013 \Microsoft Visual Studio 12.0\VC\include\functional
template <class _Fun, class... _Types>
inline _Bind<false, void, _Fun, _Types...>
bind(_Fun && _Fx, _Types &&... _Args)
{ // bind a function object
...
} template <class _Rx, class... _Ftypes, class... _Types>
inline _Bind<true, _Rx, _Rx (* const)(_Ftypes...), _Types...>
bind(_Rx (*_Pfx)(_Ftypes...), _Types&&... _Args)
{ // bind a function pointer
...
} template <class _Rx, class _Farg0, class... _Types>
inline _Bind<false, void, _Pmd_wrap<_Rx _Farg0::*, _Rx, _Farg0>, _Types...>
bind(_Rx _Farg0::* const _Pmd, _Types&&... _Args)
{ // bind a wrapped member object pointer
...
} #define _IMPLICIT_PMF_WRAP(CALL_OPT, X1, CV_OPT) \
template <class _Rx, class _Farg0, class... _Ftypes, class... _Types> \
inline _Bind<true, _Rx, _Pmf_wrap<_Rx(CALL_OPT _Farg0::*)(_Ftypes...) CV_OPT, _Rx, _Farg0, _Ftypes...>, _Types...> \
bind(_Rx(CALL_OPT _Farg0::* const _Pmf)(_Ftypes...) CV_OPT, _Types&&... _Args) \
{ /* bind a wrapped CV_OPT member function pointer */ \
...
} _MEMBER_CALL_CV(_IMPLICIT_PMF_WRAP, )
...
• 函数模板说明
以cplusplus.com中描述的原型说明:
基于Fn参数返回一个函数对象,并且以Args参数绑定为函数对象的参数。每个参数要么绑定一个参数值,要么绑定为一个std::placeholders。如果参数绑定成一个值,那么返回的函数对象将总使用绑定的参数值做为调用参数,即调用传入参数将不起作用;如果参数绑定为std::placeholders,那么返回的函数对象在被调用时需要传入实时参数,参数填充的位置即由placeholder指定的序号。
bind函数返回的函数对象类型和Fn一致,除非用户在Ret参数中指定了返回类型。需要注意的是,Ret参数只是一个模板参数,它并不能由传入该函数的参数进行隐式推导。
• 模板参数说明
以cplusplus.com中描述的原型说明:
Fn : 函数对象、普通函数指针或类成员函数指针。
Args : 用于绑定的参数列表。其中每个参数要么是参数值要么是一个placeholder
std::bind详解
• 绑定普通函数
#include <iostream>
#include <functional>
using namespace std; int g_Minus(int i, int j)
{
return i - j;
} int main()
{
function<int(int, int)> f1 = bind(g_Minus, , );
function<int()> f2 = bind(g_Minus, , ); // 绑定参数返回的函数对象实际等同这种形式
function<int(int, int)> f3 = bind(g_Minus, placeholders::_1, placeholders::_2);
function<int(int)> f4 = bind(g_Minus, , placeholders::_1); // 绑定第一个参数
function<int(int)> f5 = bind(g_Minus, placeholders::_1, ); // 绑定第二个参数 cout << f1(, ) << endl; // -1,实际传入参数将不起作用
cout << f2() << endl; // -1
cout << f3(, ) << endl; //
cout << f4() << endl; // -2
cout << f5() << endl; // 2
return ;
}
• 绑定模板函数
#include <iostream>
#include <functional>
using namespace std; template <class T>
T g_Minus(T i, T j)
{
return i - j;
} int main()
{
function<int(int, int)> f1 = bind(g_Minus<int>, , );
function<int()> f2 = bind(g_Minus<int>, , ); // 绑定参数返回的函数对象实际等同这种形式
function<int(int, int)> f3 = bind(g_Minus<int>, placeholders::_1, placeholders::_2);
function<int(int)> f4 = bind(g_Minus<int>, , placeholders::_1); // 绑定第一个参数
function<int(int)> f5 = bind(g_Minus<int>, placeholders::_1, ); // 绑定第二个参数 cout << f1(, ) << endl; // -1,实际传入参数将不起作用
cout << f2() << endl; // -1
cout << f3(, ) << endl; //
cout << f4() << endl; // -2
cout << f5() << endl; // return ;
}
• 绑定lambda表达式
#include <iostream>
#include <functional>
using namespace std; int main()
{
function<int(int, int)> f = bind([](int i, int j){ return i - j; }, placeholders::_1, placeholders::_2);
cout << f(, ) << endl; // -1
return ;
}
• 绑定函数对象
#include <iostream>
#include <functional>
using namespace std; struct Minus
{
int operator() (int i, int j)
{
return i - j;
}
}; int main()
{
function<int(int, int)> f = bind(Minus(), placeholders::_1, placeholders::_2);
cout << f(, ) << endl; // -1
return ;
}
• 绑定类静态成员函数
#include <iostream>
#include <functional>
using namespace std; class Math
{
public:
static int Minus(int i, int j)
{
return i - j;
}
}; int main()
{
function<int(int, int)> f = bind(&Math::Minus, placeholders::_1, placeholders::_2);
cout << f(, ) << endl; // -1
return ;
}
• 绑定类对象成员函数
#include <iostream>
#include <functional>
using namespace std; class Math
{
public:
int Minus(int i, int j)
{
return i - j;
}
}; int main()
{
Math m;
function<int(int, int)> f = bind(&Math::Minus, &m, placeholders::_1, placeholders::_2);
cout << f(, ) << endl; // -1
return ;
}
• 返回值的类型转换
#include <iostream>
#include <functional>
using namespace std; class Math
{
public:
int Minus(int i, int j)
{
return i - j;
}
}; struct Result
{
int m_Result; Result() : m_Result() {}
Result(int result) : m_Result(result) {}
}; int main()
{
Math m;
auto f = bind<Result>(&Math::Minus, &m, placeholders::_1, placeholders::_2);
Result r = f(, );
cout << r.m_Result << endl; // -1
return ;
}
std::bind的更多相关文章
- C++11之std::function和std::bind
std::function是可调用对象的包装器,它最重要的功能是实现延时调用: #include "stdafx.h" #include<iostream>// std ...
- std::bind和std::function
std::bind 用于绑定一个函数,返回另外一种调用方式的函数对象 ,可以改变参数顺序 和个数,特别是在多线程的程序中,经常用它将函数进行包装,然后打包发送给工作线程,让工作线程去执行我们的任务. ...
- std::function,std::bind
std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数.bind()接受一个函数(或者 ...
- std::function,std::bind复习
#include <iostream> #include <functional>//std::bind返回函数对象 void fun1(int a, int b) { std ...
- C++11 std::bind std::function 高级使用方法
从最基础的了解,std::bind和std::function /* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ # ...
- C++ 11 笔记 (四) : std::bind
std::bind 接受一个可调用的对象,一般就是函数呗.. 还是先上代码: void func(int x, int y, int z) { std::cout << "hel ...
- cocos2dx 3.0 它 使用std::bind更换CC_CALLBACK_N
在cocos2dx 3.0 版本号,回调函数本质4一个CC_CALLBACK_N 替换功能.N的回调函数的参数的数量的代表 1.让我们来看看这些CC_CALLBACK_N怎么用 比方action的回调 ...
- std::bind 的使用说明
转自: https://www.cnblogs.com/cmranger/p/4743926.html ///////////////////// std::bind bind是对C++98标准中函数 ...
- std::bind学习
std::bind bind是对C++98标准中函数适配器bind1st/bind2nd的泛化和增强,可以适配任意的可调用对象,包括函数指针.函数引用.成员函数指针和函数对象. bind接受的第一个参 ...
- 第12课 std::bind和std::function(3)_std::function可调用对象包装器
1. std::function (1)首先是一个类模板,用于包装可调用对象.可以容纳除了类成员(函数)指针之外的所有可调用对象. (2)可以将普通函数,lambda表达式和函数对象类统一起来.尽管它 ...
随机推荐
- 纪念伟大的sb错-noip滚粗
人弱就是弱,被sb错虐翻. 手一抖一生就毁了 开此博文纪念这个伟大的sb错! noip2014 d2t2逆bfs后删点手残没考虑后效性,完美爆80 愿省选rp++,求进noi,orz
- 数据库unsigned char*类型图片存进
loadimage1();测试: void Caccess_test_1Dlg::loadimage1()//存入unsigned char*类型的数据图片 { CFileException e; I ...
- 编程之美 set 6 寻找最近点对
这道题在算法课上当做例题讲过, 当时的印象也比较深 另有一道近似算法的题也在算法课上讲过, 并且印象更深, 复习的时候完全没管, 以为志在必得, 结果真考了那道近似算法, 我却没能打出来 为避免阴沟翻 ...
- 《C++ Primer Plus》学习笔记 2.1.3 C++预处理器和iostream文件
程序清单2-1 myfirst.cpp // myfirst.cpp -- displays a message #include <iostream> // a PREPROCESSOR ...
- Django学习笔记第九篇--实战练习五--关于数据的改、删操作、数据库字段属性的设置和类视图
一.首先上代码.关于类视图: class register(View): #template_name = "templates/register.html" def get(se ...
- 【黑金原创教程】【TimeQuest】【第五章】网表质量与外部模型
声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...
- 【BZOJ4146】[AMPPZ2014]Divisors
[BZOJ4146][AMPPZ2014]Divisors Description 给定一个序列a[1],a[2],...,a[n].求满足i!=j且a[i]|a[j]的二元组(i,j)的个数. In ...
- Docker的基本使用(部署python项目)
今天开始利用docker来部署项目,当然,首先,需要安装好Docker,这个在我的上篇中写了 一.准备项目 我写的是一个爬取某ppt网站的代码,就一个ppt1.py是爬虫,然后,ppts是存放下载的p ...
- XML 配置里的 Bean 自动装配
在XML文件中,先看一下下面的代码: <bean id="student" class="com.jeremy.spring.beans.student" ...
- Hibernate-sessio缓存的操作
首先咋们看一个图: flush:首先箭头是由缓存指向数据库,即当我调用 Session.flush()方法时它会强制使数据库的记录跟缓存 中的对象状态保持同步 ,如果不一致,就会发送Sql语句 ,保持 ...