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

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::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

【讨论】:

【参考方案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);

【讨论】:

以上是关于如何将指向方法的指针作为另一个方法参数传递的主要内容,如果未能解决你的问题,请参考以下文章

指向类方法的函数指针作为参数

用指向实例中方法的指针替换参数中的静态函数指针

带有默认参数的包装方法,该参数是指向另一个包装类型的空指针

模板函数将参数函数指针指向类方法

插槽(指向方法成员的指针)作为 SIP 中方法的参数

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?