C++调用另一个函数中的类函数
C++ calling a class function inside another function
我试图通过提供类成员函数作为参数来调用类内部的外部函数(将函数作为输入)。我的代码如下:
using namespace std;
// This is my external function
double integrate (double a, double b, int steps, double (*func)(double)){
// code for integration using function pointer
};
Class A
{
protected:
vector<double> to_data, from_data;
int data_size;
public:
A (); // constructor
double calculate_parameter(double t){
// some class member function that makes use of other class members
};
double get_result(double x){
double sum = 0;
for (int i=0;i<data_size;i++){
// this is basically what causes the error
sum = sum + integrate(to_data[i],from_data[i],1,calculate_parameter);
}
};
}
但是,它向我显示无法转换函数calculate_parameter的错误。我想出了一个解决这个问题的方法是修改外部函数,使其也采用类对象。有没有办法在不实例化新类对象的情况下做到这一点?提前感谢!
更一般的方法是放弃这些 1970 年代的函数指针并使用本千年的技术:
#include <functional>
double integrate (double a, double b, int steps, std::function<double(double)> f)
{
// ...
}
class A
{
double calculate_parameter(double t);
double get_result(double x)
{
using std::placeholders::_1;
double sum = 0;
for (int i = 0; i < data_size; i++) {
sum = sum + integrate(
to_data[i],
from_data[i],
1,
std::bind(&A::calculate_parameter, this, _1)
);
}
return sum;
}
};
这提供了一种简单易行的方法来绑定到基本上任何类型的函数,并将成员函数的this
指针"烘焙"到函子本身,而无需在最终调用站点(即在integrate
内,实际上只需要调用f
!
一种更"现代"的方法是将 calculate_parameter
调用包装在 lambda 中:
template <typename Callable>
double integrate (double a, double b, int steps, Callable f)
{
// ...
}
class A
{
double calculate_parameter(double t);
double get_result(double x)
{
double sum = 0;
for (int i = 0; i < data_size; i++) {
sum = sum + integrate(
to_data[i],
from_data[i],
1,
[this](double x) { return this->calculate_parameter(x); }
);
}
return sum;
}
};
请注意,我已经将std::function<double(double)>
替换为推导的模板参数Callable
;您不必这样做,但是通常不要在不需要时强制进行lambda到std::function
的转换。(就我个人而言,我非常喜欢能够强制f
将采取double
并返回double
,而不必依赖其用法来检查这一点。
此函数calculate_parameter必须是静态的。有关函数对象的更多信息,请访问功能对象
相关文章:
- 在类构造函数中传递对外部函数的引用
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 将自由函数绑定为类成员函数
- 带有类的函数指针
- 如何在qt中从另一个类调用函数
- 具有enable_if外部类原型的模板类构造函数定义
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 自动重复 extern "C"函数中的类构造函数采用的相同参数
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 类的前向声明之后的类成员函数定义,在类声明之前
- 模板化类构造函数的模板实例化
- 从类成员函数到类 C 函数指针的转换
- C++派生的类构造函数
- 在类构造函数中使用结构变量
- 在类构造函数中定义结构变量的参数
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 为什么下面的模板化类成员函数无法编译?
- 调用原子的 store() 时可以调用基类型类的函数吗?C++
- 模板化检查是否存在带有参数列表的类成员函数?
- 为什么类构造函数为其成员生成析构函数?