在C++11中添加了两个函数绑定模板, 即function和bind。function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却比函数指针更加灵活,特别是函数指向类的非静态成员函数时。
std::function和std::bind都可以绑定到普通函数(包括类的静态函数)、类的成员函数 。
下面给出简单的示例 :
//
// main.cpp
// Cpp11StdBind
//
// Created by mrsimple on 4/12/14.
// Copyright (c) 2014 mrsimple. All rights reserved.
//
#include <iostream>
#include <string>
#include <functional>
using namespace std;
// 用于普通函数和类的静态成员函数
typedef function<void (int)> mdPoint;
// 普通函数
void printNum(int num)
{
cout<<__func__<<", the num is "<<num<<endl;
}
// class
class ThreadPool
{
public:
ThreadPool() { cout << "max size : " << max_size<<endl; }
~ThreadPool() {}
// 静态函数
static void setThreadPoolMaxSize(int size) {
max_size = size ;
cout<<__func__<<", set thread pool size , " <<size<<endl;
}
// 非静态成员函数
void setCoreThread(int core) {
core_size = core ;
cout<<__func__<<", core size , " <<core<<endl;
}
void outputCoreSize()
{
cout<<__func__<<", core size "<<core_size<<endl;
}
// 使用bind来绑定回调函数
void bindCallback()
{
mdPoint mp = bind(&ThreadPool::setCoreThread, this, placeholders::_1) ;
mp(10);
}
public:
static int max_size;
// 非静态成员变量, 可以直接初始化数据
int core_size = 5;
} ;
// 定义静态成员变量
int ThreadPool::max_size = 100 ;
// main
int main(int argc, const char * argv[])
{
cout<<ThreadPool::max_size<<endl;
// 使用function来绑定函数指针
mdPoint mp = (&printNum);
mp(123);
// 指向类的静态函数
mp = (&ThreadPool::setThreadPoolMaxSize);
mp(456);
auto tp = new ThreadPool();
tp->bindCallback() ;
// 带参数
auto cb2 = bind(&ThreadPool::setCoreThread, tp, placeholders::_1) ;
cb2(66);
// 使用bind来设置回调函数, 不带参数的
auto callback = bind(&ThreadPool::outputCoreSize, tp) ;
callback();
// lambda的bind
auto lmd = bind([] { cout<<"this is lambda."<<endl;}) ;
lmd();
// 传递参数
auto lmdp = bind([](string name) { cout <<name<<endl; }, placeholders::_1) ;
lmdp("mr.simple");
// 在placeholders位置上设置参数
auto lmdp2 = bind([](string name) { cout << "new name " <<name<<endl; } , "MR.SIMPLE -- NEW .");
lmdp2();
return 0;
}
function的回调类的成员函数:
#include <iostream>
#include <functional>
using namespace std;
//
class View{
public:
void onClick(int x, int y)
{
cout<<"X : "<<x<<", Y : "<<y<<endl;
}
} ;
// 定义function类型, 三个参数
function<void (View*, int, int)> clickCallback ;
// 普通函数
function<int (int, int)> f ;
//
int add(int a, int b) {
return a + b ;
}
//
int main(int argc, const char * argv[])
{
View button ;
// 指向成员函数
clickCallback = &View::onClick ;
// 进行调用
clickCallback(&button, 10, 123);
f = add ;
cout<<"result : "<<f(4,5)<<endl;
return 0;
}