如何将指向方法的指针作为另一个方法参数传递
Posted
技术标签:
【中文标题】如何将指向方法的指针作为另一个方法参数传递【英文标题】:how to pass pointer to a method as another method argument 【发布时间】:2014-09-04 16:37:41 【问题描述】:全部!
我有一些类层次结构
class A public: virtual void foo(int, T*) = 0; virtual void foo1(int, T*) = 0;;
class B : public A public: void foo(int, T*) override; void foo1(int, T*) override;;
class C : public B public: void foo(int, T*) override; void foo1(int, T*) override;;
在客户端代码中
class Dvoid client_foo(A* pA, bool, T*);;
void D::client_foo(A* pA, bool b, T* pT)
if (b) pA->foo(1050, pT);
else pA->foo1(5010, pT);
我想引入新函数void D::client_helper(???)
,它将实现pA
、int 值、pT
和指向要调用的class A
方法的指针。
所以,D::client_foo(...)
可以改写为:
void D::client_foo(A* pA, bool b, T* pT)
if (b) client_helper(pA, 1050, pT, std::mem_fn(&A::foo));
else client_helper(pA, 5010, pT, std::mem_fn(&A::foo1));
问题是:D::client_helper()
应该有什么签名?
【问题讨论】:
为什么你的类定义过于紧凑? 【参考方案1】:由于A::foo
和A::foo1
具有相同的签名,因此不需要std::mem_fn
或其他抽象,只需让client_helper
采用指向A
的成员函数的普通指针即可。
void client_helper(A* pA, int i, T* pT, void(A::*memfn)(int, T*))
(pA->*memfn)(i, pT);
并将其称为
void client_foo(A* pA, bool b, T* pT)
if (b) client_helper(pA, 1050, pT, &A::foo);
else client_helper(pA, 5010, pT, &A::foo1);
Live demo
【讨论】:
【参考方案2】:对于将函数作为参数传递,您有std::function
。
【讨论】:
【参考方案3】:我使用了std::function<ret_type(arg_1)>
和std::bind
而不是std::mem_fn
例如
客户端功能:
void client_helper(std::function<void (T*)> fnFoo, T* pT)
nfFoo(pT);
函数调用:
usign namespace std::placeholders;
A* pA;
T* pT;
client_helper(std::bind(&A::foo, pA, 1050, _1), pT);
【讨论】:
以上是关于如何将指向方法的指针作为另一个方法参数传递的主要内容,如果未能解决你的问题,请参考以下文章