C++类模板中成员函数作为参数传递的问题求助
解决类模板成员函数作为参数传递的问题
错误原因
非静态成员函数隐含了一个this指针参数,无法直接转换为std::function<double(double)>类型——后者期望的是不需要对象实例即可调用的函数(普通函数、静态成员函数或已绑定对象的可调用对象)。
优先方案:使用std::function结合Lambda(最简洁直观)
修改some_method的实现,用Lambda捕获this并包装成员函数调用:
#include <functional> // 确保包含头文件 template<typename CT> double MyClass<CT>::some_method() { double x = 42.; // 补充变量声明 // 用Lambda捕获this,包装linfun调用 return solver([this](double val) { return this->linfun(val); }, x); }
备选方案:使用std::bind绑定this
如果更习惯std::bind的写法,也可以通过绑定this和成员函数指针生成符合要求的可调用对象:
#include <functional> // 包含头文件 template<typename CT> double MyClass<CT>::some_method() { double x = 42.; // 绑定this和成员函数指针,用占位符接收参数 return solver(std::bind(&MyClass<CT>::linfun, this, std::placeholders::_1), x); }
不使用std::function的方案:成员函数指针
如果不需要std::function的灵活性,可以直接将solver的参数改为成员函数指针,调用时结合this:
- 修改头文件中
solver的声明:
template<typename CT> class MyClass { public: double linfun(double x) { return 0.5 * x + 3.; } virtual double some_method(); // 参数改为成员函数指针 virtual double solver(double (MyClass<CT>::*f)(double), double k); };
- 修改
solver的实现:
template<typename CT> double MyClass<CT>::solver(double (MyClass<CT>::*f)(double), double k) { return (this->*f)(k); // 通过this调用成员函数指针 }
- 修改
some_method的调用:
template<typename CT> double MyClass<CT>::some_method() { double x = 42.; return solver(&MyClass<CT>::linfun, x); // 传递成员函数指针 }
为什么之前的尝试失败
- 直接传
linfun:编译器无法将非静态成员函数转换为普通函数指针,缺少this绑定。 this->*linfun:这是成员函数的调用语法,不是获取成员函数指针的正确写法(正确写法是&MyClass<CT>::linfun)。this->linfun:试图获取绑定了this的函数指针,但这种形式无法直接适配std::function,必须通过Lambda或std::bind包装。
内容的提问来源于stack exchange,提问作者JE_Muc
相关产品推荐
相关产品推荐

