C++中成员函数返回函数指针的语法

5

我有一个程序,我想修复它。不确定如何使其在语法上正确。

class A{
    void f(){};
    void (A::*)()get_f(){return &A::f;}
};

此外,我希望最终将函数定义概述移动到以下位置。
void A::(*)()A::get_f(){
    return &A::f;
}

这里的正确语法是什么?
非常感谢您的帮助!

5
使用typedef。 - Robᵩ
@Ed:只是对我当前问题的抽象化。 :) - Qiang Li
实际问题——如何编写声明——已经被其他人回答了。这里有一个链接,可能对练习如何阅读它们有用。http://www.codeproject.com/KB/cpp/complex_declarations.aspx - Dabbler
有额外的加分,如果有人能编写一个返回&A::get_f的函数。typedef是作弊,decltype也是。 - rodrigo
1
@rodrigo: 我认为应该是这样的:void (A::* (A::*get_get_f())())() {return &A::get_f;},然后如果你想在实例 a 上调用 f()(a.*(a.*(a.get_get_f)())())(); - netcoder
5个回答

5

像这样:

class A{
    void f(){};
    void (A::*get_f())() {return &A::f;}
};

同样地:

void (A::* A::get_f())(){
    return &A::f;
}

点击此链接查看在ideone上的演示。注意,使用方式与typedef(其他答案中的方法)相同。

顺便说一句,为了获得额外的积分和惊喜(哈哈):

void (A::* (A::* get_get_f())())();

实际上是 void (A::*get_f())() { return &A::f; },但使用typedef更好。 - bames53
@bames53:你写的和jpalecek的答案有什么区别? - Qiang Li
@jpalecek:如果我仍然不想使用typedef,您能否请添加如何在main()中使用它的说明? - Qiang Li
1
@Qiang Li:我认为应该是:(a.*(a.get_f()))(); - netcoder
@Qiang Li:如果你要将指针存储在本地,你可以这样做:void (A::*ptr)() = a.get_f(); (a.*ptr)();,所以如果你把它们结合起来,就得到了上面的代码。 - netcoder
@QiangLi,之前有一个错误,但是答案已经更新了。最初其中一个括号的位置是错误的。虽然我在历史记录中并没有看到这一点。我最初看到的定义是:void (A::*get_f)()() {return &A::f;} - bames53

1

只需使用typedef:

class A {
    typedef void (A::*AFn)();

    void f() { }

    AFn get_f(){ return &A::f; }
};

我可以不使用typedef来完成吗?只是好奇。 - Qiang Li
1
你可以这样做,但没有理智的人会想要这样做。 - Puppy

1

最简单的解决方案是使用typedef:

class A
{
  typedef void (A::*funptr)();
  void f() {}
  funptr get_f() { return &A::f; }
};

如果你坚持直接编写,可以使用

class A
{
  void f() {}
  void (A::*get_f())() { return &A::f; }
};

1

使用typedef,可以使语法更易于理解。

在下面的例子中,函数是在类外定义的。

class A{
    typedef void (A::*p)();
    void f(){};
    p get_f();
};

A::p A::get_f() { return &A::f; }

你可以以同样的方式在类内部定义它,

class A{
    typedef void (A::*p)();
    void f(){};
    p get_f() { return &A::f; }
};

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接