簡體   English   中英

將方法傳遞給C ++中的方法

[英]Passing method to method in c++

我遇到了在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);
    }
};

至於處理f1f2方法,我需要執行一些相同的操作,我決定使用這些操作創建一個方法( foo_main )並將所需的函數(f1或f2)傳遞給它,而不是創建兩個具有代碼重復的單獨方法。

但是,這些代碼在編譯時失敗:

'F_test :: f1':函數調用缺少參數列表; 使用'&F_test :: f1'創建一個指向成員'F_test :: f2'的指針:函數調用缺少參數列表; 使用'&F_test :: f2'創建一個指向成員的指針

如果編寫&F_test :: f1&F_test :: f2 ,則會發生另一個編譯錯誤:

'void std :: _ Func_class <_Ret,> :: _ Set(std :: _ Func_base <_Ret,> *)':無法將參數1從'_Myimpl *'轉換為'std :: _ Func_base <_Ret,> *'

非靜態成員函數需要與之一起調用的對象。 沒有F_test實例,您不能只調用f1() 嘗試執行此操作會導致編譯錯誤。

要通過成員函數創建一個空的二進制函數,您需要實例綁定到該實例,無論通過std::bind

std::function <void()> m1 = std::bind(&F_test::f1, this);

或lambda:

 std::function <void()> m1 = [this]{ f1(); };

請注意,在這種情況下, bind無效,因為您已經重載了名稱f1 不過,在一般情況下它會起作用。 無論如何,lambda都可以工作。

更簡單的方法是使用lambda:

F_test test;

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

要選擇其他方式(在std::bind )重載f1()而存在其他重載(如f1(std::string) ),則必須指定所需的重載:

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

如果由於某些原因不想使用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);
  }
};

您不能使用成員函數指針來初始化std :: function。 請改用lambda。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM