std :: greater <int>()(100,300),为什么有效?

时间:2015-10-06 10:42:31

标签: c++ functor

根据我的理解,Functor应该用作

std::greater<int> g;
std::cout << std::boolalpha << g(10, 3) << std::endl; 

或作为函数的参数。

find_if(v.begin(), v.end(), std::greater<int>())

但这是什么意思?

std::cout << std::greater<int>()(100, 300) << std::endl; // output: false

当我使用not_equal_to如下所示时,它无法通过compile:

int* pt = std::adjacent_find (numbers, numbers+5, std::not_equal_to<int>(1,1)) +1;

2 个答案:

答案 0 :(得分:3)

  

为什么会有效?

在第一段代码中,您在函子上调用operator(),并打印出结果。

std::cout << std::greater<int>()(100, 300) << std::endl; // output: false  
             ~~~~~~~~~~~~~~~~~~~ <- create a temporary object(functor)
                                ~~~~~~~~~~ <- call operator() on the temporary object
  

为什么不起作用?

在第二个代码中,您将仿函数传递给算法,并且通过在其上调用operator()来在算法内部调用仿函数。

int* pt = std::adjacent_find (numbers, numbers+5, std::not_equal_to<int>(1,1)) +1;
                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~

您正在尝试使用2个参数创建临时std::not_equal_tostd::not_equal_to没有该ctor,因此只需将其更改为使用默认ctor,就像使用std::find_if调用std::greater一样。

int* pt = std::adjacent_find (numbers, numbers+5, std::not_equal_to<int>()) +1;

答案 1 :(得分:1)

如您所知,对于具有无参数构造函数的类X,您可以编写X()作为其他表达式的一部分来创建(临时堆栈)对象。 IE浏览器。以下两个代码是相同的[如果callFunc不期望可更改的引用等]:

X x;  
callFunc(x);  

callFunc(X());

现在std::greater<int>()(100, 300)创建一个std::greater<int>对象,如上所述,并使用参数100和300执行仿函数。它只是前两个代码示例的组合,一对用于创建对象的括号一个叫它。在std::not_equal_to<int>(1,1)中,您缺少一对括号。