C++11標準庫bind函數應用教程

bind 是什麼?

bind 顧名思義: 綁定

通俗來講呢,可以這麼理解有點像函數指針的意思。

資料上是這麼講的:可以將 bind 函數看做一個通用函數的適配器,它接受一個可調用對象,生成一個新的可以調用對象來“適應”原對象參數列表

它一般調用形式:

// 其中 newCallable 是一個可調用的對象, arg_list 是以逗號分隔的參數列表
// 這時我們調用 newCallable,newCallable 就會調用 callable, 並用 arg_list 傳遞參數
auto newCallable = bind(callable, arg_list);

好瞭,重點在於 arg_list 裡,那麼我們如何傳入參數呢

它們是靠這些參數的位置來識別的,形如 _n 之類的, n 是整形, _1 是第一個參數,_2是第二個參數,以此類推。

而名字 _n 是定義在 placeholders 命名空間中, 而 placeholders 本身又定義在 std 命名空間中, 所以形如:

using std:: placeholders::_1

接下來,我們舉例幾個列子

舉個栗子

bind 是在頭文件 #include <functional> 中, 首先要包含它。

1. bind 無參數的普通函數

#include <iostream>
#include <functional> // 包含此頭文件

// 普通函數
void Fun()
{
	std::cout << "I am Fun!" << std::endl;
}

// 主函數
int main()
{
	auto fun = std::bind(Fun); // 適配 Fun 函數並返回一個可調用的對象
	fun();
	return 0;
}

調試結果:

2. bind 1個參數的普通函數

#include <iostream>
#include <functional> // 包含此頭文件

// 普通函數
void Fun(int a)
{
	std::cout << "I am Fun! a = " << a <<std::endl;
}

// 主函數
int main()
{
	auto fun = std::bind(Fun, std::placeholders::_1); 
	fun(5);
	return 0;
}

調試結果:

3. bind 多個參數的普通函數

#include <iostream>
#include <functional> // 包含此頭文件

// 普通函數
int Fun(int a, int b)
{
	return a - b;
}

// 主函數
int main()
{
	auto fun = std::bind(Fun, std::placeholders::_1, std::placeholders::_2); 
	std::cout << fun(5, 2) << std::endl;
	return 0;
}

調試結果:

4. bind 多個參數的普通函數並打亂參數位置

#include <iostream>
#include <functional> // 包含此頭文件

// 普通函數
int Fun(int a, int b)
{
	return a - b;
}

// 主函數
int main()
{
	auto fun1 = std::bind(Fun, std::placeholders::_1, std::placeholders::_2);
	auto fun2 = std::bind(Fun, std::placeholders::_2, std::placeholders::_1);
	std::cout << fun1(5, 2) << std::endl;
	std::cout << fun1(5, 2) << std::endl;
	return 0;
}

調試結果:

5. bind 類的成員函數

#include <iostream>
#include <functional> // 包含此頭文件

class MyClass {
public:
	MyClass() {}
	~MyClass() {}

public:
	void printInfo() {
		std::cout << "MyClass Info." << std::endl;
	}
};

// 主函數
int main()
{
	MyClass A;
	auto fun = std::bind(&MyClass::printInfo, A);
	fun();
	return 0;
}

調試結果:

再舉個應用栗子

#include <iostream>
#include <functional> // 包含此頭文件

typedef std::function<void(int)> CallbackType;
// A 類
class MyClassA {
public:
	void regeditCallBack(CallbackType fun)
	{ _callback_fun = fun; }

	void printInfoA(int d) 
	{ _callback_fun(d); }

private:
	CallbackType _callback_fun;
};
// B 類
class MyClassB {
public:
	void printInfoB(int d) {
		std::cout << d << std::endl;
	}
};

// 主函數
int main()
{
	MyClassB B;
	auto funB = std::bind(&MyClassB::printInfoB, B, std::placeholders::_1);

	MyClassA A;
	A.regeditCallBack(funB);
	A.printInfoA(1);

	return 0;
}

調試結果:

到此這篇關於C++11標準庫bind函數應用教程的文章就介紹到這瞭,更多相關C++11 bind函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: