可呼叫物件與function

2021-07-14 17:27:16 字數 1688 閱讀 4576

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...