l********a 发帖数: 1154 | 1 函数指针一直没有搞太懂,先描述下需求:
我想用遗传算法解一个问题,现在大体部分完成了,算法也能跑,计算得出结果也正确.整
个算法是编译为dll供其他程序调用
目前设置的算法有个objectiveFun(string funName)函数,根据输入字符串来决定调用
哪个目标函数,(因为边写边测试,用的最简单的函数f(x)=x_1+x_2,测试,但是真正计算
的时候,目标函数很复杂的),
double objectiveFun(string funName)
{
if (0==funName.compare("test"))
{ return testFun(x); }
else if (0==funName.compare("run"))
{ return run(x); }
}
现在我想把这个GA算法做成一个通用的,所以准备将objectiveFun改写,如果可以接受一
个函数指针,这样编程的时候就不用写死了,运行时没法修改.想弄成动态改变的,不知道
可不可行?因为我没有深入看过函数指针,不知道这个路走不走的通?多谢. | t****t 发帖数: 6806 | 2 yes you can, as long as all the functions have the same signature. in your
case, looks like you input a double (?) and output a double.
【在 l********a 的大作中提到】 : 函数指针一直没有搞太懂,先描述下需求: : 我想用遗传算法解一个问题,现在大体部分完成了,算法也能跑,计算得出结果也正确.整 : 个算法是编译为dll供其他程序调用 : 目前设置的算法有个objectiveFun(string funName)函数,根据输入字符串来决定调用 : 哪个目标函数,(因为边写边测试,用的最简单的函数f(x)=x_1+x_2,测试,但是真正计算 : 的时候,目标函数很复杂的), : double objectiveFun(string funName) : { : if (0==funName.compare("test")) : { return testFun(x); }
| c******e 发帖数: 545 | 3 像这样?
double objectFunc(double (*p_func)(double)) {
if(p_func) {
return p_func(x);
} else {
//do whatever you want
}
}
【在 l********a 的大作中提到】 : 函数指针一直没有搞太懂,先描述下需求: : 我想用遗传算法解一个问题,现在大体部分完成了,算法也能跑,计算得出结果也正确.整 : 个算法是编译为dll供其他程序调用 : 目前设置的算法有个objectiveFun(string funName)函数,根据输入字符串来决定调用 : 哪个目标函数,(因为边写边测试,用的最简单的函数f(x)=x_1+x_2,测试,但是真正计算 : 的时候,目标函数很复杂的), : double objectiveFun(string funName) : { : if (0==funName.compare("test")) : { return testFun(x); }
| f*******n 发帖数: 12623 | 4 In C++, you might want to use function pointers or function objects. The
most general is to make a template function that can accept any callable
type:
template
double objectFunc(F func) {
return func(x);
} | l********a 发帖数: 1154 | 5 我接受一个double arr[],经过运算,输出一个double,是objective function的值.
多谢几位.
fakeshawn朋友回复的这个模板我没大看明白
这样输入,c++会认为func是个函数吗?如果这个函数不存在呢?
调用的办法是: double obj = objectFunc(testObjFunc);
这样对吗?如果已经有一个函数定义为 double testObjFunc(...);
可是x[]参数怎么传递进去? | b***i 发帖数: 3043 | 6 先不讲template, 你可以定义你的函数指针,和map<函数名字,函数指针>
typedef double (*pFun)(double*);
map > funmap;
在你的统一调度的函数中
pFun p = funmap["name"];
double rc=(*p)(x);
【在 l********a 的大作中提到】 : 我接受一个double arr[],经过运算,输出一个double,是objective function的值. : 多谢几位. : fakeshawn朋友回复的这个模板我没大看明白 : 这样输入,c++会认为func是个函数吗?如果这个函数不存在呢? : 调用的办法是: double obj = objectFunc(testObjFunc); : 这样对吗?如果已经有一个函数定义为 double testObjFunc(...); : 可是x[]参数怎么传递进去?
| l********a 发帖数: 1154 | 7 非常感谢,用map将string和函数指针对应起来的确是我最想实现的东西.之前对函数指
针不大理解.看看好点儿了.现在去写代码测试,如果map["key"]返回NULL就是该字符串
对应的函数没有定义吧
【在 b***i 的大作中提到】 : 先不讲template, 你可以定义你的函数指针,和map<函数名字,函数指针> : typedef double (*pFun)(double*); : map > funmap; : 在你的统一调度的函数中 : pFun p = funmap["name"]; : double rc=(*p)(x);
| t****t 发帖数: 6806 | 8 try use map.find(key)==map.end() for query existence.
【在 l********a 的大作中提到】 : 非常感谢,用map将string和函数指针对应起来的确是我最想实现的东西.之前对函数指 : 针不大理解.看看好点儿了.现在去写代码测试,如果map["key"]返回NULL就是该字符串 : 对应的函数没有定义吧
| l********a 发帖数: 1154 | 9 多谢,我目前程序中有一个map 的判断用的全是
if (map["key"].empty())...
请问这样判断得到的value的结果和直接find(key)哪个更好一点?或者说更标准些?
【在 t****t 的大作中提到】 : try use map.find(key)==map.end() for query existence.
| t****t 发帖数: 6806 | 10 map[key] always create key first if not exist. so you can never check
existence. you can only check the validity of value.
【在 l********a 的大作中提到】 : 多谢,我目前程序中有一个map 的判断用的全是 : if (map["key"].empty())... : 请问这样判断得到的value的结果和直接find(key)哪个更好一点?或者说更标准些?
|
|