如何使用指向类的成员指向函数的指针数组

C++中,将指向类的成员函数的指针作为参数传入普通函数,怎么才不会错? - 知乎41被浏览2810分享邀请回答typedef void (T::*B)(int x, int y, int z);
B b = &T::
t.*b(x, y, z); // 必须指定t
那如何去得到类实例对象t呢?遗憾的是,别人的foo原型没有提供一个context让你去传递一个指针,也就不可能传递t了。正确的做法应该是:typedef void (T::*B)(int x, int y, int z);
void fun(A a, B b, C c, void* context);
这样的话,你才可以把一个自定义的类实例指针当作上下文对象,通过context传入到你最终的回调函数里面。例子:void fun(A a, B b, C c, void* context)
T* t = reinterpret_cast&T*&(context);
t-&*b(x, y, z);
B b = &T::
fun(a, b, c, &t);
在C++/C兼容时代,这种办法是最常见的解决方案。在C++11时期,你们可以改用std::function来传递函数指针。由于std::function可以绑定一个类成员函数和类实例,因此可以像全局函数那样调用一个类成员函数。当然呢,foo的定义也必须修改成下面这个样子。void foo(std::function&void()& a, std::function&void(int, int, int)& b,
std::function&void()& c) {
b(x, y, z);
std::function&void(int, int, int)& b = std::bind(&T::foo, &t);
foo(a, b, c);
那么,问题是,为什么这种方案不需要context呢?答案是:context已经隐含在std::function里了。在调用std::bind生成std::function时,你已经绑定了类实例t。20添加评论分享收藏感谢收起3添加评论分享收藏感谢收起查看更多回答C++鍑芥暟鎸囬拡涓庢寚閽堣瘑鍒玙寰??鑻

我要回帖

更多关于 指向函数的指针数组 的文章

 

随机推荐