2015-10-06 43 views
2

按我的理解,仿函数应作为本std ::更大<int>()(100,300),为什么它工作?

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如下,它不能通过编译:

int* pt = std::adjacent_find (numbers, numbers+5, std::not_equal_to<int>(1,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)中,您缺少一对括号。

+0

这两个“代码”是不一样的。 – Shoe

+0

你的意思是用这种方式? 'int * pt = std :: adjacent_find(numbers,numbers + 5,std :: not_equal_to ()(1,1))+1;' 仍然无法通过编译。 :( – ponypaver

+2

@ponypaver不,他的意思是:'std :: adjacent_find(数字,数字+5,std :: not_equal_to ())' – fjardon

4

它为什么工作?

在第一个代码中,您调用函子的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; 
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

你试图通过一个构造函数取两个参数创建一个临时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; 
+0

你的答案令人困惑,在引用“为什么它不工作”之后,你解释它为什么在第二种情况下工作 – Slava

+0

@Slava在引用“why isn'它工作“我试图解释为什么它*不*工作... – songyuanyao

+0

@Slava你会介意指出哪一部分是特别混淆的吗? – songyuanyao

相关问题