c++类成员函数调用一个普通函数,而普通函数的一个形参是function模板函数

c++类成员函数调用一个普通函数,而普通函数的一个形参是function模板函数,该普通函数在被调用时其函数参数是用的该类中的另一个成员函数。例如该类中的两个成员函数A、B,还有一个普通函数C,A调用C,C的一个形参是function模板函数,这时用的B函数作为该function模板函数的实参。
该普通函数的function模板函数形参具体写成 function<double (double*)> GoalFun,而实参用的是类的成员函数double xxx::B(double *para)。不知道是不是实际的函数与function模板函数形参不匹配?因为,形参给的是普通函数的形式,实参却是类的成员函数。能不能在不改function<double (double*)> 尖括号内的参数类型的情况下解决该问题?
我有现成的算法函数SA,SA在计算过程中要调用一个目标函数,在不同情况下,目标函数采用的公式不同,所以SA函数的一个形参为function<double (double*)> GoalFun,用以传递目标函数,之前的写法是目标函数以匿名函数的形式定义在调用SA函数的函数体中,而这次的情况是目标函数是一个类的成员函数,SA函数的function形参数据类型为function<double (double*)>,把类成员函数作为实参的话会出错。SA函数是以前已经做好的一个头文件中的函数,我想利用现有的代码,其实做一下代码移植,把SA函数写到类里面去,去掉function这个参数,以一般函数调用的方式调用类的其他成员函数就能解决问题。只是想能利用现有的头文件就尽量不去移植代码

使用std::bind

std::bind(&xxx::B,this, std::placeholders::_1, ....)  //有一个参数要被外部传递

xxx::B 类函数

this 类对象指针,也可以具体的对象指针,如xxx* px; 传px;

std::placeholders::_1 需要被传递的参数个数

另外可以在std::bind的时候额外传递参数


如:

double xxx::C(double *para, bool su);
std::bind(&xxx::C,this, std::placeholders::_1, true) // 外部传一个参数,这里额外传一个参数

std::bind(&xxx::C,this, std::placeholders::_2) // 外部传二个参数,就不能额外传参数了



可以使用以下宏定义,出自cocos2dx

#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)

#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)

#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)

#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

追问

用bind,我之前就想过,这样解决不了我的问题。因为我有现成的算法函数SA,而该函数在计算过程中要调用一个目标函数,不同的情况下,目标函数采用的公式不同,但目标函数的输入输出基本上都是目标参数序列传递进去,目标函数值返回回来

追答

std::bind是可以在SA函数里传递的,用std::placeholders::_1,std::placeholders::_2。。。代替参数个数

追问

的确是我对bind了解得还不全面,可以解决我的问题。谢谢你

温馨提示:答案为网友推荐,仅供参考