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