将函数作为函数的参数

penghuahuijuan 2016-06-14 04:36:05
我想将一个函数作为另一个的函数的参数,定义如下:
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 )
{ .......}

现在有一个问题:函数的第一个参数为函数指针,但是在这种定义方式下,第一个作为参数的函数的所有参数的类型就定了,
后面如果想传入不同参数类型的函数指针作为参数,就得将这个函数重新定义一次,换一个不同类型的参数的函数指针。
有没有其他方法,像模板函数一样,将其作为函数指针传入参数??怎么解决!!!
谢谢大家!!
...全文
275 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 u014260892 的回复:
用这样的模板函数实现的话,那每个函数指针的功能基本一样,只是处理不同类型的数据,那如果我要传进去的函数指针 功能都不一样呢??能不能只声明一个模板函数,作为传入参数,调用的时候根据具体情况,调用不同的函数。
这种情况就不应该 由参数传入函数指针,直接在函数中调用对应的函数。
赵4老师 2016-06-15
  • 打赏
  • 举报
回复
没有银弹!
penghuahuijuan 2016-06-15
  • 打赏
  • 举报
回复
引用 6 楼 corfox_liu 的回复:
可以使用函数对象啊,重载operator()操作符
怎么个实现法,给个例子,学习一下嘛,谢谢了
lunat 2016-06-14
  • 打赏
  • 举报
回复
使用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:添加一个中间层,适配所有的函数类型? 取决于你”这些不同的函数“有哪些共性。
penghuahuijuan 2016-06-14
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
[quote=引用 3 楼 u014260892 的回复:] [quote=引用 1 楼 akirya 的回复:] 1 定义成模板参数 2 可以定义成void*,使用的时候强转过去.
你好!我试着定义模板函数,但一直提示有错误,能给个例子吗?? 谢谢!! 定义为void感觉可以,这种转换会不会影响数据的处理呢?[/quote] template<class F> void func(F f , .... ) { f( 参数 ); } void*不会影响的,只是写起来不太好看而已。[/quote] 用这样的模板函数实现的话,那每个函数指针的功能基本一样,只是处理不同类型的数据,那如果我要传进去的函数指针 功能都不一样呢??能不能只声明一个模板函数,作为传入参数,调用的时候根据具体情况,调用不同的函数。
corfox_liu 2016-06-14
  • 打赏
  • 举报
回复
可以使用函数对象啊,重载operator()操作符
  • 打赏
  • 举报
回复
引用 3 楼 u014260892 的回复:
[quote=引用 1 楼 akirya 的回复:] 1 定义成模板参数 2 可以定义成void*,使用的时候强转过去.
你好!我试着定义模板函数,但一直提示有错误,能给个例子吗?? 谢谢!! 定义为void感觉可以,这种转换会不会影响数据的处理呢?[/quote] template<class F> void func(F f , .... ) { f( 参数 ); } void*不会影响的,只是写起来不太好看而已。
penghuahuijuan 2016-06-14
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
还可以考虑使用代码生成技术。
这样做是不是太难了,有没有简单点的办法
penghuahuijuan 2016-06-14
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
1 定义成模板参数 2 可以定义成void*,使用的时候强转过去.
你好!我试着定义模板函数,但一直提示有错误,能给个例子吗?? 谢谢!! 定义为void感觉可以,这种转换会不会影响数据的处理呢?
赵4老师 2016-06-14
  • 打赏
  • 举报
回复
还可以考虑使用代码生成技术。
  • 打赏
  • 举报
回复
1 定义成模板参数 2 可以定义成void*,使用的时候强转过去.

64,169

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧