将函数作为函数的参数

C++语言 码拜 9年前 (2016-04-15) 1303次浏览
本人想将一个函数作为另一个的函数的参数,定义如下:
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*,使用的时候强转过去.

10

还可以考虑使用代码生成技术。

5

引用:
Quote: 引用:

1 定义成模板参数
2 可以定义成void*,使用的时候强转过去.

你好!本人试着定义模板函数,但一直提示有错误,能给个例子吗?
谢谢!
定义为void感觉可以,这种转换会不会影响数据的处理呢?

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:添加一个中间层,适配全部的函数类型?
取决于你”这些不同的函数“有哪些共性。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明将函数作为函数的参数
喜欢 (0)
[1034331897@qq.com]
分享 (0)