use*_*652 0 c++ pointers function-pointers function
有什么区别
typedef double F(double)
Run Code Online (Sandbox Code Playgroud)
和
typdedef double (*FPT)(double);
Run Code Online (Sandbox Code Playgroud)
?
在我看来,我可以将两者作为参数传递给函数,即
bar1(FPT f);
bar2(F f);
Run Code Online (Sandbox Code Playgroud)
但是我能做到
FPT f = &foo;
Run Code Online (Sandbox Code Playgroud)
我不能做
F f = foo;
Run Code Online (Sandbox Code Playgroud)
即我不能创建F类型的变量?
你在很多方面都是正确的.F是一个函数类型,FPT是一个函数指针类型.
如果你有一个函数类型的对象,你可以获取它的地址并获得一个函数指针.但是,函数类型的对象不是真正的第一类C++对象.只有实际的函数属于这种类型,你不能创建一个函数对象(除了通过声明一个函数!),因此你不能分配给它(如F f = foo;).
您可以引用函数的唯一方法是通过函数指针或引用:
FPT f1 = &foo;
F * f2 = &foo;
F & f3 = foo;
Run Code Online (Sandbox Code Playgroud)
另见这个答案.
请注意,对于回调,我更喜欢指针类型的引用类型,因为它与传递任何其他变量的方式相比更自然,并且因为您可以将地址和衰减应用于引用并获取指针,您可以用指针做:
double callme(F & f, double val) // not: "F *" or "FPT"
{
return f(val);
// "&f" and "std::decay<F>::type" still make sense
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |