天天看點

C++文法——std::function 使用function的使用

function的使用

這是c++11新添加的,頭檔案

#include <functional>

簡單而言就是一個函數包裝器,一個通用函數類型

用法:

function<int(int, int)>

裡面傳入的是傳回值 和參數清單

将其當做

std::string

std::vector<>

、這樣的類型就可以了。隻不過其值為函數指針,但比函數指針更靈活。

因為

std::function

是一種模闆,是以要傳入類型,就如

std::vector<int>

傳入類型int一樣

不過,

std::function

傳入的是函數類型 傳回值 (參數類型) 如:

std::function<void (int)>

示例1 : 普通函數

void gFunc()
{
	cout << "gFunc" << endl;
}
int main()
{
	std::function<void()> f = gFunc;
	f();
 
	getchar();
	return 0;
}
           

示例2 模闆函數

template <class T>
T g_Add(T i, T j)
{
	cout << i + j;
	return i + j;
}
 
 
int main()
{
	std::function<int(int,int)> f = g_Add<int>;
	f(2,3);
 
	getchar();
	return 0;
}
           

示例三: 匿名函數

auto g_Lambda = [](int i, int j)
{
	return i + j;
}; //匿名函數 此處有分号
 
int main()
{
	std::function<int(int, int)> f = g_Lambda;
	cout<<f(2,3);
 
	getchar();
	return 0;
}
           

示例四:函數對象

/函數對象
struct Add
{
	int operator()(int i, int j)
	{
		return i + j;
	}
};
 
//模闆函數對象
template <class T>
struct AddT
{
	T operator()(T i, T j)
	{
		return i + j;
	}
};
 
 
int main()
{
	std::function<int(int, int)> f = Add();
	cout<<f(2,3)<<endl;
 
	std::function<int(int, int)> ft = AddT<int>();
	cout << ft(5, 6)<<endl;
 
	getchar();
	return 0;
}
           

示例5:類成員函數

class Computer
{
public:
	static int Add(int i, int j)
	{
		return i + j;
	}
 
	template<class T>
	static T AddT(T i, T j)
	{
		return i + j;
	}
 
	int AddN(int i, int j)
	{
		return i + j;
	}
};
 
//存儲對成員函數的調用 
 
int main()
{
	//1、 類靜态函數
	std::function<int(int, int)> f = &Computer::Add;
	cout << f(1, 1) << endl;
 
	//2、 類靜态模闆函數
	std::function<int(int, int)> ft = &Computer::AddT<int>;
	cout << ft(1, 1) << endl;
 
 
 
	//普通函數綁定  需要構造類對象
	Computer c;
 
	//3、 普通函數 需使用bind,将類對象位址 &c 綁定上
	std::function<int(int, int)> fN = std::bind(&Computer::AddN, &c, placeholders::_1, placeholders::_2);
	cout << fN(1, 1) << endl;
 
 
	//4、普通函數, 也可以這樣調用  個人覺得這個比 bind 麻煩,不建議
	std::function <int(const Computer &, int, int)> fN2 = &Computer::AddN;
	cout << fN2(c,1, 1) << endl;
 
 
 
 
 
	getchar();
	return 0;
}
           

繼續閱讀