所有!
我有一些类层次结构
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 D{void 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()
应该有哪些签名?
答案 0 :(得分:3)
由于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);
}
答案 1 :(得分:2)
为了将函数作为参数传递,您有std::function
。
答案 2 :(得分:0)
我使用std::function<ret_type(arg_1)>
和std::bind
代替std::mem_fn
e.g。
客户端功能:
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);