根据我的理解,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;
答案 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_to
。 std::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)
中,您缺少一对括号。