Red*_*ted 1 c++ templates functor parentheses template-specialization
下面是一个简单的例子,有些东西让我烦恼.此处还有一个指向在线c ++编译器的链接,这里有https://ide.geeksforgeeks.org/oxQd8FU2NV
#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;
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能写PrintClass<int>()if(),就像这样PrintClass<int>(第一个for_each行)?
当使用函数(不是函数对象)时,我们不能使用()(第二个for_each行),所以我们这样写PrintF<int>?
我应该如何解释/解析这两个for_each函数中的第三个参数?
std::for_each需要一个可以像函数一样使用的对象.当你使用
for_each (vect.begin(), vect.end(), PrintF<int>);
Run Code Online (Sandbox Code Playgroud)
PrintF<int>衰减到指向PrintF<int>函数的指针,然后for_each可以使用该指针调用该PrintF<int>函数.
在
for_each (vect.begin(), vect.end(), PrintClass<int>());
Run Code Online (Sandbox Code Playgroud)
PrintClass<int>是类的名称,它不是对象.您需要()在最后告诉编译器创建该类型的临时对象,PrintClass<int>然后for_each可以使用该对象来调用它operator ().