() 函子后面的括号,而不是函数指针?
() Parentheses after functor but not function pointer?
下面是一个简单的例子,里面有一些东西让我烦恼。这里还有一个带有给定示例的在线 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>
?
我应该如何解释/解析这两个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>
是类的名称,但它不是对象。 您需要最后的()
告诉编译器创建PrintClass<int>
类型的临时对象,然后for_each
可以使用该对象来调用其operator ()
。
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);
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针