()括号后面是函子,但不是函数指针?

时间:2018-10-29 17:35:43

标签: c++ templates functor template-specialization parentheses

下面是一个简单的示例,其中包含一些令人讨厌的内容。 https://ide.geeksforgeeks.org/oxQd8FU2NV

也是给定示例的在线c ++编译器的链接。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <class T>
void PrintF (const T& printInt) { cout << printInt << " "; }

template <class T>
class PrintClass {
public:
void operator()(T elem) const {
    cout << elem << " ";
}
};

int main () {
vector<int> vect;
for (int i=1; i<10; ++i) {
    vect.push_back(i);
}


for_each (vect.begin(), vect.end(), PrintClass<int>()); cout << endl;

for_each (vect.begin(), vect.end(), PrintF<int>);      cout << endl;

//  for_each (vect.begin(), vect.end(), PrintF<int>() );  
//  won't compile because of ()  in PrintF<int>()

return 0;
}

为什么我们不能在没有()的情况下写 PrintClass<int>() ,就像这样 PrintClass<int> (for_each第一行)?

当使用函数(不是函数对象)时,我们一定不能使用()(第二for_each行),所以我们这样写PrintF<int>

我应该如何解释/解析这两个for_each函数中的第三个参数?

2 个答案:

答案 0 :(得分:5)

std::for_each需要一个可以像函数一样使用的对象。使用时

for_each (vect.begin(), vect.end(), PrintF<int>);

PrintF<int>衰减为指向PrintF<int>函数的指针,然后for_each可以使用该指针来调用PrintF<int>函数。

for_each (vect.begin(), vect.end(), PrintClass<int>());

PrintClass<int>是类的名称,它不是对象。您需要最后使用()来告诉编译器制作一个PrintClass<int>类型的临时对象,然后for_each可以使用该对象来调用其operator ()

答案 1 :(得分:3)

PrintF<int>是一个函数。我们正在将该函数传递给for_each。放入括号是不正确的,因为我们试图(不成功)调用该函数。

PrintClass<int>是一门课。我们不能传递类,因为它们不是值。但是,我们可以传递该类的实例,因此我们可以创建该类的实例并将其传递。以下两个调用的结果相同

for_each (vect.begin(), vect.end(), PrintClass<int>());

PrintClass<int> myFunction = PrintClass<int>();
for_each (vect.begin(), vect.end(), myFunction);