函数指针和c++模板
Function pointers and C++ templates
我有一个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
函数的类的实例指针保存到一个全局变量。
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)
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数