函数指针和c++模板

Function pointers and C++ templates

本文关键字:模板 c++ 指针 函数      更新时间:2023-10-16

我有一个c++代码,我真的需要在里面使用C函数:

int procedure(... , S_fp fun , ...)

其中fun -是指向函数的指针,该函数的签名必须是这样的:

int fun(double* , double* , double)

我要使用的函数指针是类模板的成员:

template<int nPar> class PenaltyAlgorithm
{
public:
...
int Calculate(double* param, double* val, double prec)
{
   ...
}
...
}
如您所见,它的签名是有序的。但是当我这样做的时候:过程(…, PenaltyAlgorithm::计算,…),

I get error:

error: cannot convert ‘int (PenaltyAlgorithm<30>::*)(double*, double*, double)’ to ‘int (*)(...)’ for argument ...

,请帮助。如果您需要任何其他信息,请写信给我。

谢谢! !

看完答案后,我明白了添加关于类的信息是很重要的:

template<int nPar> class PenaltyAlgorithm
{
public:
int Calculate(double* param, double* val, double prec)
    {
    *val = comp_fun->Compute(param);
    }
double* RunAlgorithm()
    {
        ...
        procedure(... &PenaltyAlgorithm<nPar>::Calculate, ...);
        ... 
    }
...
private:
...
CompositeFunction<nPar>* comp_fun;
}

1)。我不能使用静态fun,因为这个fun需要访问类的成员;

2)。我们可以使用这个事实吗,从fun-member of class调用procedure ?

Calculate是penalty算法上的一个非静态方法。它需要一个PenaltyAlgorithm的实例来执行,所以它不能作为一个普通的函数指针提供给C函数。

计算函数可以是静态的吗?如果可以,它应该像C函数指针一样工作,只是它不能访问PenaltyAlgorithm类中的非静态数据。

请记住,作为实例成员的int Calculate(double* param, double* val, double prec)有一个隐藏的this指针,这是全局函数或静态成员所没有的。如果没有这个,它将不知道在哪个PenaltyAlgorithm上运行它。

指针的类型应该是int (PenaltyAlgorithm::*)(double* param, double* val, double prec)或者Calculate应该是静态的

如果int procedure(... , S_fp fun , ...)必须是一个C函数,那么没有办法直接执行您正在寻找的操作。如果你试图传递一个类成员函数指针,它将有一个隐藏的this指针作为其堆栈中的第一个参数,因此原型将不匹配。

然而,你可以创建一个全局或静态函数,在内部使用一个保存的实例指针来间接访问PenaltyAlgorithm类。你可以试试下面的命令:

1)将要传递给procedure函数的类的实例指针保存到一个全局变量。

2)创建一个新的全局函数int CalculateGlobal(double* param, double* val, double prec)

3)传递CalculateGlobal函数的指针作为procedure函数的函数指针。

4) calculategglobal函数可以使用保存的实例指针来访问特定类的内部。

这当然不是一个好方法…

不能将这样的指针传递给成员函数,除非它是静态成员函数

你必须将Calculate设置为静态,使用

static int Calculate(double* param, double* val, double prec)
不是

int Calculate(double* param, double* val, double prec)