【问题标题】: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 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() 应该有什么签名?

【问题讨论】:

  • 为什么你的类定义过于紧凑?

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


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 2015-02-12
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多