c++11:std::function

introduce

头文件

#include <functional>

类模板声明

template< class R, class... Args >
class function<R(Args...)>;

类模板std::function是通用的多态函数包装器。std::function的实例能存储、拷贝并调用任何可复制构造的可调用目标—函数,例如lambda表达式,bind表达式,或其他函数对象,以及成员函数指针和指向成员数据的指针。

函数绑定

绑定普通函数

void print(int&);
std::function<void(int&)> f = print

绑定lambda

std::function<void()> f = []{ std::cout << "stored lambda" };

绑定bind返回的结果

void print(int);
...
std::function<void()> f = std::bind(print, 2);

绑定成员函数

class test{
public:
test(){}
void testa() { std::cout << "testa" << std::endl; }
};
...
std::function<void()> f = &test::testa();
test a;
f(a);

application

函数映射

class test{
public:
test(){
func = {std::bind(&test::testa, this, std::placeholders::_1),
std::bind(&test::testb, this, std::placeholders::_1),
std::bind(&test::testc, this, std::placeholders::_1)};

for(int i = 0; i < func.size(); ++i){
id2func[1<<i] = func[i];
}
}

void print() {
id2func[1](1);
id2func[2](2);
id2func[4](3);
}

void testa(int a) {
std::cout << a << std::endl;
}

void testb(int b) {
std::cout << b << std::endl;
}

void testc(int c) {
std::cout << c << std::endl;
}

private:
std::vector<std::function<void(int)>> func;
std::map<int, std::function<void(int)>> id2func;
};