【C/C++】【C++11】函數調用運算符和functional

總述

  • ()圓括號是函數調用的明顯標記,()也叫函數調用運算符;
  • 如果在類中重載了函數調用運算符,就可以想使用函數一樣使用該類的對象了;
  • 只要對象所屬的類重載了()函數運算符,那麼這個類對象就變成了可調用的;而且可以調用多個版本的(),只要在參數類型或者數量上有差別即可;
  • 重載了()的類實例化的對象,稱爲函數對象;因爲可以調用這些對象;

#include <iostream>
#include <functional>
using namespace std;


//如果值小於0,返回0;否則返回實際值;
class Zero
{
public:

	Zero(int x)
	{
		cout << "Zero(int x)" << endl;
	}


	int operator()(int value) const
	{
		if (value < 0) return 0;
		return value;
	}
    
    int operator()(int value, int x) const
	{
		if (value < 0) return 0;
		return value;
	}
};
int main()
{
	
	Zero obj(1);
	//定義一個對象,在()中增加實參列表;
	int res = obj.operator()(10);
	cout << res << endl;
	res = obj(2);
	cout << res << endl;
	return 0;
}

不同調用對象的相同調用形式

標準庫function類型介紹

  • function類模板:要提供模板參數來表示該function類型能夠表示的對象的調用形式;

    function<int(int)> 聲明瞭一個function類型,用來代表一個可調用對象,它所代表的這個可調用對象是:參數爲int,返回值爲int
    

#include <iostream>
#include <functional>
#include <map>
using namespace std;


//如果值小於0,返回0;否則返回實際值;
class Zero
{
public:



	int operator()(int value) const
	{
		if (value < 0) return 0;
		return value;
	}
};

//一種調用形式,對應一個函數類型int(int)
int echo_val(int value) //調用參數和返回值和Zero中的int operator()(int value) const相同,即調用形式相同;
{
	cout << value << endl;
	return value;
}

//int echo_val()
//{
//	return 1;
//}

int main()
{
	
	//可調用對象:
	// 1. echo_val 函數;
	// 2. Zero中的int operator()(int value) const



	Zero obj;
	//hashmap.insert({ "zero", obj });
	//hashmap.insert({ "zero", Zero });
	function<int(int) > f1 = obj; //類對象,因爲類有()重載
	function<int(int) > f2 = echo_val; //函數指針
	function<int(int)>  f3 = Zero(); //用類名生成一個對象;

	f1(2);
	f2(3);
	f3(0);


	//把這些可調用對象的指針保存起來,目的方便隨時調用這些可調用對象,這些指針類似與C語言中的函數指針;
	//map key-value
	map<string, function<int(int)>> hashmap;
	hashmap.insert({ "e_v", echo_val});  //echo_val有重載版本,編譯報錯;無法放到function<int(int)>中;
	hashmap.insert({ "b_t", obj});
	hashmap.insert({ "zero", Zero() });

	hashmap["e_v"](10);


	////echo_val有重載版本,編譯報錯;無法放到function<int(int)>中;通過定義函數指針來解決;
	int (*fp)(int) =  echo_val;
	function<int(int) >fff = fp; //直接將函數指針賦值給function類對象;
	//int (*ff) () = echo_val;
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章