2011-05-25 142 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>