2011-05-25 145 views
1

我只是讀this函數對象和構造

class biggerThan 
     { 
     public: 
     const int testValue; 
     biggerThan(int x) : testValue(x) { } 

     bool operator()(int val) const 
     { return val > testValue; } 
    }; 

現在說其使用像

std::list<int>::iterator firstBig = 
    std::find_if(aList.begin(), aList.end(), biggerThan(12)); 

OR

只需在這樣 biggerThan對象(12)

現在,當大(12)這個被使用時,它可以調用constrcuto r初始化testvalue或()運算符被重載,12被傳遞給函數(bool operator()(int val)const),以便返回一個bool。

哪一個先出現/它是如何工作的

做它會導致任何歧義或做呼叫轉移到overlaode操作發生在一些時尚像

object.operator()。(12) 。

請讓我的支持清楚。

+0

[...](http://example.com)什麼? – 2011-05-25 08:28:37

回答

6

也許the following code會清楚:

#include <iostream> 
#include <algorithm> 

class biggerThan 
     { 
     public: 
     const int testValue; 
     biggerThan(int x) : testValue(x) { 
      std::cout << "Construction of biggerThan object with value " 
         << x << std::endl; 
     } 

     bool operator()(int val) const 
     { 
      if (val > testValue) { 
       std::cout << val << " is bigger than " << testValue 
          << std::endl; 
       return true; 
      } 
      else { 
       std::cout << val << " is *not* bigger than " << testValue 
          << std::endl; 
       return false; 
      } 
     } 
}; 

int main() { 
    int data[] = {0,1,2,3,4,5,6,7,8,9}; 
    std::for_each(data, data+10, biggerThan(4)); 
}  

輸出是:

Construction of biggerThan object with value 4 
0 is *not* bigger than 4 
1 is *not* bigger than 4 
2 is *not* bigger than 4 
3 is *not* bigger than 4 
4 is *not* bigger than 4 
5 is bigger than 4 
6 is bigger than 4 
7 is bigger than 4 
8 is bigger than 4 
9 is bigger than 4 

會發生什麼:

  1. 的最後一個參數std::for_eachbiggerThan類型的對象,這是由參數4構建的。
  2. 這個biggerThanoperator()(int)對於data中的每個元素都會調用對象(實際上是它的一個副本)。

您使用的算法(std::find_if)在這方面的工作原理是相同的。

+0

謝謝,我明白了 – munish 2011-05-25 08:52:48

2

biggerThan(12)這是用它可以調用構造函數初始化該testvalue

是。 biggerThan(12)創建biggerThantestvalue組至12

實例時std::find_if()調用函子,它將調用該實例的operator()(int val)成員函數。

2

biggerThan(12)會通過比較大的對象std::find_if(aList.begin(), aList.end(), biggerThan(12));行;

要調用operator()以下是方法;

biggerThan obj(12); //This is a constructor call 
biggerThan(13); //This is function operator call 

@std::find_if(aList.begin(), aList.end(), biggerThan(12));傳遞的第三個參數爲temporary object of biggerThan initialized with 12

+0

mayank,largerThan obj(12);不會侵犯操作員的權利.....我問,因爲我認爲它會 – munish 2011-05-25 08:37:05

+0

@munish:否。它會調用構造函數 – Mayank 2011-05-25 08:38:43

+0

嗯...謝謝..親愛的 – munish 2011-05-25 08:41:21

0

在一般情況下,你可以使用更大的<完成同樣的事情>和bind2nd <>,這是在<功能>

list<int>::iterator firstBig = find_if(aList.begin(), aList.end, 
             bind2nd(greater<int>(), 12)); 

bind2nd將任何二元函數對象,如更大的<int>轉換爲一元函數對象。在更大的<INT>的情況下,它有效地創建一個功能對象,其小於操作者看起來像這樣

bool operator>(const int& arg) 
{ 
    return functor.operator>(arg, 12); 
} 

其中算符大於<INT>