这似乎不一致。为什么我们使用& 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;
} 
有帮助吗?

解决方案

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

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

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

来自C ++标准:

  

4.3功能指针转换

     
      
  1. 函数类型T的左值可以转换为类型的右值   &#8220;指向T。&#8221;结果是指向函数的指针。
  2.   

脚注52:

  

此转换从不适用于非静态成员函数,因为   无法获得引用非静态成员函数的左值。

我认为,出于一致性的原因,他们宁愿只允许和运作,但隐式转换只是C传承的神器......

其他提示

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

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按预期工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top