2

这似乎不一致。为什么我们使用 &Example::func 而不是 Example::func?Example::func 或 &exampleFunction 有没有用处?似乎我们不能引用一个函数,以便排除 Example::func。而且我想不出一种使用 &exampleFunction 的方法,因为 exampleFunction 已经返回了一个指针。

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 
4

2 回答 2

6

因为这就是标准定义函数指针的方式。

您实际上总是必须使用地址运算符&来获取指向函数的指针,但是对于常规函数和静态成员函数,标准中定义了从函数到指针到函数的隐式转换。

这不是为(非静态)成员函数定义的,因为您无法获得非静态成员函数的左值。

从 C++ 标准:

4.3 函数到指针的转换

  1. 函数类型 T 的左值可以转换为“指向 T 的指针”类型的右值。结果是指向函数的指针。

脚注 52:

这种转换永远不会应用于非静态成员函数,因为无法获得引用非静态成员函数的左值。

我认为出于一致性原因,他们宁愿只允许 &function,但隐式转换只是 C 遗产的产物......

于 2009-03-05T09:10:30.733 回答
1

关键是使用Function Pointers。对于一个非常粗略的示例,假设您有一个具有多个成员变量的类,您可能需要通过这些成员变量对该类类型的数组的元素进行排序,如下所示:

struct CL {
    int x, y, z;
};

bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);

...

CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);

这里 std::sort 用于对 CL 对象数组进行排序。看第三个参数,它是一个函数的名字。std::sort 函数可以在第三个参数中获取函数指针,并将该函数用作比较器来对数组进行排序。如何定义 sort_by_* 函数以使 std::sort 按预期工作取决于我们。

于 2009-03-05T07:16:51.350 回答