c++11学习笔记(2)- std::function

std::function 是一个 函数包装模板 ,用来存储、转移、调用目标函数,包括普通函数、类的成员函数、lambda表达式、仿函数等。如果std::function未包裹任何可调用的元素,则会抛出std::bad_function_call 异常。

下面是一个关于std::function的使用的一个简单的示例
首先我们定义几个函数:

// 普通函数
void printFunc(int number)
{
	std::cout << __FUNCTION__ << " " << number << std::endl;
}

class Foo
{
public:
	// 非静态成员函数
	void addFunc(int number) {
		std::cout << __FUNCTION__ << " " << number + m_Number << std::endl;
	}

	// 静态成员函数
	static void staticFunc(int number) {
		std::cout << __FUNCTION__ << " " << number << std::endl;
	}
	int m_Number = 10;
};

// 仿函数
class ObjectFunc
{
public:
	void operator() (int number){
		std::cout << __FUNCTION__ << " " << number << std::endl;
	}
};

下面是关于函数的调用:

// 普通函数
std::function<void(int)> f1 = printFunc;
f1(10);

// lambda表达式
std::function<void(int)> f2 = [](int n) {
	std::cout << __FUNCTION__ << " " << n << std::endl;
};
f2(10);

Foo foo;
// 类的非静态成员函数(对象调用)
std::function<void(int)> f3_1 = std::bind(&Foo::addFunc, foo, std::placeholders::_1);
std::function<void()> f3_2 = std::bind(&Foo::addFunc, foo, 20);
f3_1(10);
f3_2();

// 类的非静态成员函数(指针调用)
std::function<void(int)> f4_1 = std::bind(&Foo::addFunc, foo, std::placeholders::_1);
std::function<void()> f4_2 = std::bind(&Foo::addFunc, foo, 20);
f4_1(10);
f4_2();

// 带固定参数
std::function<void()> f5 = std::bind(printFunc, 100);
f5();

// 类的静态函数
std::function<void(int)> f6 = &Foo::staticFunc;
f6(100);

// 仿函数
std::function<void(int)> f7 = ObjectFunc();
f7(100);

运行结果如下:
printFunc 10
main::<lambda_d2573905243ae936524d018319db3380>::operator () 10
Foo::addFunc 20
Foo::addFunc 30
Foo::addFunc 20
Foo::addFunc 30
printFunc 100
Foo::staticFunc 100
ObjectFunc::operator () 100


作者:douzhq
个人主页:https://www.douzhq.cn
文章同步页:https://douzhq.cn/c11_stdfunction/

发布了88 篇原创文章 · 获赞 79 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/douzhq/article/details/89366959