本人想将一个函数作为另一个的函数的参数,定义如下:
int lmdif_( int (*fcn)(int*,int*,double*,double*,int*),
int* m,
int* n,
double* x,
double* fvec,
double* ftol,
double* xtol,
double* gtol,
int* maxfev,
double* epsfcn,
double* diag,
int* mode,
double* factor,
int* nprint,
int* info,
int* nfev,
double* fjac,
int* ldfjac,
int* ipvt,
double* qtf,
double* wa1,
double* wa2,
double* wa3,
double* wa4 )
{ …….}
现在有一个问题:函数的第一个参数为函数指针,但是在这种定义方式下,第一个作为参数的函数的全部参数的类型就定了,
后面假如想传入不同参数类型的函数指针作为参数,就得将这个函数重新定义一次,换一个不同类型的参数的函数指针。
有没有其他方法,像模板函数一样,将其作为函数指针传入参数?怎么解决!
谢谢大家!
int lmdif_( int (*fcn)(int*,int*,double*,double*,int*),
int* m,
int* n,
double* x,
double* fvec,
double* ftol,
double* xtol,
double* gtol,
int* maxfev,
double* epsfcn,
double* diag,
int* mode,
double* factor,
int* nprint,
int* info,
int* nfev,
double* fjac,
int* ldfjac,
int* ipvt,
double* qtf,
double* wa1,
double* wa2,
double* wa3,
double* wa4 )
{ …….}
现在有一个问题:函数的第一个参数为函数指针,但是在这种定义方式下,第一个作为参数的函数的全部参数的类型就定了,
后面假如想传入不同参数类型的函数指针作为参数,就得将这个函数重新定义一次,换一个不同类型的参数的函数指针。
有没有其他方法,像模板函数一样,将其作为函数指针传入参数?怎么解决!
谢谢大家!
解决方案
10
1 定义成模板参数
2 可以定义成void*,使用的时候强转过去.
2 可以定义成void*,使用的时候强转过去.
10
还可以考虑使用代码生成技术。
5
template<class F>
void func(F f , …. )
{
f( 参数 );
}
void*不会影响的,只是写起来不太好看而已。
5
可以使用函数对象啊,重载operator()操作符
10
使用std::bind把不同参数列表的函数整合成一致参数列表的函数对象(std::function)。
int fcn1(int*); int fcn2(int*,int*); int fcn3(int*,int*,double*); int lmdif(std::function<void()> fcn, ...); lmdif(std::bind(&fcn1, &int1)); lmdif(std::bind(&fcn2, &int1, &int2)); ...
另外,参数太多了,看得头晕,建议对参数进行结构化布局,不同领域、不同用途、不同层次的参数分别放入不同的对象中,最终一个对象包含全部参数传入函数。不然太乱了。
“能不能只声明一个模板函数,作为传入参数,调用的时候根据具体情况,调用不同的函数。”
你也说了,调用的时候根据具体情况,调用不同的函数,那就是这些不同的函数都可能会用到,那就是说在无法明确哪个函数会被用到的情况下,就必须提供全部可能会调用到的函数。
建议:
解决方案1:不要传函数指针,而是传对象,在函数中调用对象的成员函数;
解决方案2:将不同的情况分开,通过重载函数实现;
解决方案3:添加一个中间层,适配全部的函数类型?
取决于你”这些不同的函数“有哪些共性。