() 仿函数后的括号而不是函数指针?
() Parentheses after functor but not function pointer?
下面是一个简单的例子,里面有一些让我烦恼的东西。还有一个 link 到带有给定示例的在线 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;
}
为什么我们不能写PrintClass<int>()
不用(),像这样PrintClass<int>
(先for_each 行) ?
并且在使用函数(不是函数对象)的时候不能使用()(第二行for_each),所以我们这样写PrintF<int>
?
我应该如何 interpret/parse 这两个 for_each 函数中的第三个参数?
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>
是 class 的名称,它不是对象。你需要最后的 ()
来告诉编译器创建一个 PrintClass<int>
类型的临时对象,然后 for_each
可以使用该对象调用它的 operator ()
.
PrintF<int>
是一个函数。我们将函数传递给 for_each
。放置括号是不正确的,因为我们会尝试(未成功)调用该函数。
PrintClass<int>
是一个 class。我们不能传递 classes,因为它们不是值。但是,我们可以传递 class 的实例,因此我们创建 class 的实例并传递它。以下两个调用将具有相同的结果
for_each (vect.begin(), vect.end(), PrintClass<int>());
PrintClass<int> myFunction = PrintClass<int>();
for_each (vect.begin(), vect.end(), myFunction);
下面是一个简单的例子,里面有一些让我烦恼的东西。还有一个 link 到带有给定示例的在线 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;
}
为什么我们不能写PrintClass<int>()
不用(),像这样PrintClass<int>
(先for_each 行) ?
并且在使用函数(不是函数对象)的时候不能使用()(第二行for_each),所以我们这样写PrintF<int>
?
我应该如何 interpret/parse 这两个 for_each 函数中的第三个参数?
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>
是 class 的名称,它不是对象。你需要最后的 ()
来告诉编译器创建一个 PrintClass<int>
类型的临时对象,然后 for_each
可以使用该对象调用它的 operator ()
.
PrintF<int>
是一个函数。我们将函数传递给 for_each
。放置括号是不正确的,因为我们会尝试(未成功)调用该函数。
PrintClass<int>
是一个 class。我们不能传递 classes,因为它们不是值。但是,我们可以传递 class 的实例,因此我们创建 class 的实例并传递它。以下两个调用将具有相同的结果
for_each (vect.begin(), vect.end(), PrintClass<int>());
PrintClass<int> myFunction = PrintClass<int>();
for_each (vect.begin(), vect.end(), myFunction);