有什么区别
typedef double F(double)
和
typdedef double (*FPT)(double);
?
在我看来,我可以将两者都作为参数传递给函数,即
bar1(FPT f);
bar2(F f);
虽然我能做到
FPT f = &foo;
我做不到
F f = foo;
即我不能创建 F 类型的变量?
最佳答案
你在很多方面都是对的。 F
是函数类型,FPT
是函数指针类型。
如果你有一个函数类型的对象,你可以获取它的地址并得到一个函数指针。但是,函数类型的对象并不是真正的一流 C++ 对象。只有实际函数属于这种类型,您不能创建函数对象(除非通过声明函数!),因此您不能分配给它(如 F f = foo;
).
您可以引用函数的唯一方法是通过函数指针或引用:
FPT f1 = &foo;
F * f2 = &foo;
F & f3 = foo;
另见 this answer .
请注意,对于回调,我更喜欢引用类型而不是指针类型,因为与传递任何其他变量的方式相比,它更自然,并且因为您可以对引用应用寻址和衰减并获取指针,这是你不能用指针做的:
double callme(F & f, double val) // not: "F *" or "FPT"
{
return f(val);
// "&f" and "std::decay<F>::type" still make sense
}
关于c++ - 函数指针类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258665/