2014-03-18 59 views
1

,同時通過對功能封裝在Boost庫的教程之一(http://www.boost.org/doc/libs/1_55_0/doc/html/function/tutorial.html)去我碰到下面的代碼來:定義運算符()函數

1  boost::function<float (int x, int y)> f; 
    2 
    3  struct int_div { 
    4   float operator() (int x, int y) const { return ((float)x)/y; } 
    5  }; 
    6 
    7 
    8  int main() 
    9  { 
10   f = int_div(); 
11   cout << f(5, 3) << endl; 
12   return 0; 
13  } 

我想繞到我的頭關於在結構中定義函數(operator()),然後將結構(使用())分配給函數包裝器f。有人可以幫助我瞭解發生了什麼,至於概念,在第3-5行和第10行。

謝謝, 艾哈邁德。

+1

這是一個仿函數。 'boost :: function'包含一個可調用的對象,並給它一個可以「調用」的類的實例。 – chris

+1

首先要認識到的是,在C++中,結構和類之間的唯一區別是成員的默認可見性:對於結構而言它是公共的,對於類是私有的。所以你真的在這裏定義一個非常公開的課程。 –

回答

3

在C++中,您可以爲您的類型提供運算符。由於函數調用(())只是該語言中的另一個運算符,因此可以爲您的類型定義它。因此,int_div中的定義表示「int_div類型的對象可以應用函數調用操作符(操作數爲intint);此類調用將返回float。」

boost::function是圍繞任何可調用的包裝。由於int_div類型的對象可以與函數調用操作符一起使用,因此它可以被調用,因此可以存儲在boost::function中。類型也匹配 - int_div中的運算符的確屬於float(int, int)類型。

然而,第10行的括號​​不是該調用者的調用;他們是一個構造函數調用。所以該行說:「使用該類型的默認構造函數創建類型爲int_div的對象,並將該對象分配到f。」

3

如果您正在使用C++ 11,你可以寫線#10:

f = int_div{}; 

這可能與你的困惑幫助。 該行創建一個類型爲int_div的臨時對象,然後將其分配給f

這不是一個函數調用,即使它看起來像一個。