c++ - 函数指针类型定义

标签 c++ function pointers function-pointers

有什么区别

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/

相关文章:

javascript - window.addEventListener ('message' , myFunction(event)) 不起作用

javascript - 这个内部函数

c++ - AVL 树中的比较由指向对象的指针组成

C++ 当 `extern int * name` 引用一个不存在的变量然后访问 `name` 时会发生什么

c++ - 我如何使用多维数组存储多个元素,然后检索元素

c++ - 在C++中以跨平台的方式调用外部文件(例如可执行文件)

c++ - C++静态继承中的取消引用指针问题?

c++ - 从注册表中提取 REG_MULTI_SZ 值并将其存储在字符串数组 C++ 中

c - 从 C 中的函数返回数组

pointers - 递归地附加到 slice