我有一个程序,我想修复它。不确定如何使其在语法上正确。
class A{
void f(){};
void (A::*)()get_f(){return &A::f;}
};
此外,我希望最终将函数定义概述移动到以下位置。
void A::(*)()A::get_f(){
return &A::f;
}
这里的正确语法是什么?
非常感谢您的帮助!
我有一个程序,我想修复它。不确定如何使其在语法上正确。
class A{
void f(){};
void (A::*)()get_f(){return &A::f;}
};
void A::(*)()A::get_f(){
return &A::f;
}
像这样:
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更好。 - bames53main()
中使用它的说明? - Qiang Li(a.*(a.get_f()))();
。 - netcodervoid (A::*ptr)() = a.get_f(); (a.*ptr)();
,所以如果你把它们结合起来,就得到了上面的代码。 - netcodervoid (A::*get_f)()() {return &A::f;}
。 - bames53只需使用typedef:
class A {
typedef void (A::*AFn)();
void f() { }
AFn get_f(){ return &A::f; }
};
最简单的解决方案是使用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; }
};
使用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; }
};
class A{
public:
typedef void(A::*mem_ptr)();
void f(){};
mem_ptr get_f();
};
A::mem_ptr A::get_f()
{return &A::f;}
int main() {
A a;
A::mem_ptr p = a.get_f();
(a.*p)();
}
来源:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.6
typedef
是作弊,decltype
也是。 - rodrigovoid (A::* (A::*get_get_f())())() {return &A::get_f;}
,然后如果你想在实例a
上调用f()
:(a.*(a.*(a.get_get_f)())())();
。 - netcoder