[英]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);
}
};
至於處理f1和f2方法,我需要執行一些相同的操作,我決定使用這些操作創建一個方法( 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.