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