将方法传递给c ++中的方法

时间:2016-04-09 19:52:58

标签: c++ c++11

我遇到了在C ++中将方法传递给方法的问题。我想要做的是减少代码量,这对于几种方法几乎是相同的。

例如,我有下一个代码:

class F_test {
public: 
    void f1() {
        std::cout << "f1" << std::endl;
    }

    void f2() {
        std::cout << "f2" << std::endl;
    }

    void foo_main(std::string str, std::function<void(void)> const &f) {
        std::cout << "some actions before" << std::endl;
        std::cout << str << std::endl;
        f();
        std::cout << "some actions after" << std::endl;
    }

    void f1(std::string s1) {
        std::function <void(void)> m1 = F_test::f1;
        foo_main("processing f1", m1);
    }

    void f2(std::string s2) {
        std::function <void(void)> m2 = F_test::f2;
        foo_main("processing f2", m2);
    }
};

至于处理 f1 f2 方法我需要执行一些相同的操作,我决定创建一个方法( foo_main )使用这些操作并将所需的函数(f1或f2)传递给它,而不是使用代码重复创建两个单独的方法。

但是,这些代码在编译时失败了:

  

'F_test :: f1':函数调用缺少参数列表;使用'&amp; F_test :: f1'创建指向成员的指针   'F_test :: f2':函数调用缺少参数列表;使用'&amp; F_test :: f2'创建指向成员的指针

如果要写&amp; F_test :: f1 &amp; F_test :: f2 ,则会发生另一个编译错误:

  

'void std :: _ Func_class&lt; _Ret,&gt; :: _ Set(std :: _ Func_base&lt; _Ret,&gt; *)':无法将参数1从'_Myimpl *'转换为'std :: _ Func_base&lt; _Ret,&gt; ; *'

3 个答案:

答案 0 :(得分:1)

更简单的是使用lambda:

F_test test;

test.foo_process("string", [&](){test.f1();});

否则选择(在std::bind中)重载f1(),而存在其他重载(如f1(std::string)),您必须指定所需的重载:

static_cast<void (F_test::*)()>(&F_test::f1)

答案 1 :(得分:1)

如果您因某些原因不想使用lambda,那么您应该重写代码:

class F_test {
public:
  void f1impl() const {
    std::cout << "f1" << std::endl;
  }

  void f2impl() const {
    std::cout << "f2" << std::endl;
  }

  void foo_process(std::string str, std::function<void(const F_test&)> const &f) {
    std::cout << "some actions before" << std::endl;
    std::cout << str << std::endl;
    f(*this);
    std::cout << "some actions after" << std::endl;
  }

  void f1(std::string s1) {
    std::function<void(const F_test&)> f = &F_test::f1impl;
    foo_process("processing f1", f);
  }

  void f2(std::string s2) {
    std::function <void(const F_test&)> m2 = &F_test::f2impl;
    foo_process("processing f2", m2);
  }
};

答案 2 :(得分:0)

您无法使用成员函数指针初始化std :: function。改为使用lambda。

void f1(std::string s1) {
    auto m1 = [this](){ f1(); };
    foo_main("processing f1", m1);
}