c++語言中有幾種可呼叫的物件:函式、函式指標、lambda表示式、bind建立的物件、以及過載了函式呼叫運算子的類。
可呼叫的物件也有型別,例如,每個lambda有它自己唯一的(未命名)類型別,函式及函式指標的型別由其返回值型別和實參型別決定。
不同型別可能具有相同的呼叫形式
//普通函式
int add(int i, int j)
//lambda,其產生乙個未命名的函式物件類
auto mod = (int i, int j) ;
//函式物件類
class
divide
}
上面這些可呼叫物件分別對其引數執行了不同的算術運算,儘管它們的型別各不相同,但是共享同一種呼叫形式:int (int , int)
可以通過定義乙個函式表來儲存指向這些可呼叫物件的」指標「。當程式需要某執行某個特定的操作時,從表中查詢該呼叫的函式。在c++中,函式表可以通過map來實現
標準庫function型別
function定義在functional標頭檔案中,下表列出了function定義的操作:
function是乙個模板,當建立乙個具體的function型別時,必須提供額外的資訊,例如function
function
f1 = add; //函式指標
function
f2 = divide(); //函式物件類的物件
function
f3 = (int i, int j) ;
cout <4, 2)<4, 2)<4,2)《使用function型別重新定義map:
map> binops;
可以把所有可呼叫物件,包括函式指標,lambda或者函式物件在內,都新增到這個map中:
map
> binops = ,
, , },
};
則呼叫形式為:
binops["+"](10,5);
binops["-"](10,5);
binops["/"](10,5);
binops["*"](10,5);
過載的函式與function:
不能直接將過載函式的名字存入function型別的物件中
int add(int i, int j)
sales_data add(const sales_data&, const sales_data&);
map> binops;
binops.insert(); //錯誤,哪個?
解決上述二義性問題的一條途徑是儲存函式指標而非函式的名字:
int (*fp)(int, int) = add; //指標所指的add是接受兩個int的版本
binops.insert(); //正確:fp指向乙個正確的add版本
同樣可以使用lambda來消除二義性:
//正確:使用lambda來指定我們希望使用的add版本
binops.insert(});
lambda內部使用的函式呼叫傳入了兩個int,因此該呼叫只能匹配接受兩個int的add版本。 可呼叫物件與function
c 語言中有幾種可呼叫的物件 函式 函式指標 lambda表示式 bind建立的物件以及過載了函式呼叫運算子的類。和其他物件一樣,可呼叫的物件也有型別。例如,每個lambda有它自己唯一的 未命名 類型別 函式及函式指標的型別則由其返回值型別和引數型別決定,等等。然而,兩個不同型別的可呼叫物件卻可能...
可呼叫物件
我們可以向演算法傳遞任何類別的可呼叫物件 函式,函式指標,過載了函式呼叫運算子的類,lambda 表示式,bind 函式。函式物件 1 如果類過載了函式呼叫運算子,則我們可以像使用函式一樣使用該類的物件。因為這樣的類同時也能儲存狀態,所以與普通函式相比他們更加靈活。例 struct absint i...
可呼叫物件
在python中可以用callable函式檢視乙個物件是不是可呼叫 1 deffn 2print ha ha ha 34callable fn 5 true 乙個類被例項化後,這個例項物件是乙個不可呼叫物件 1 class fun 2def init self,name 3 self.name na...