如何将指针作为另一个方法参数传递给方法

时间:2014-09-04 16:37:42

标签: c++ c++11 member-function-pointers

所有!

我有一些类层次结构

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()应该有哪些签名?

3 个答案:

答案 0 :(得分:3)

由于A::fooA::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

答案 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);
相关问题