1 bind和function的发散思维-控制反转 依赖注入
【示例1】
void do_sum(int values, int n)
{
int sum(0);
for (int i = 0; i < n; ++i)
{
sum += values[i];
}
cout << sum << endl;
};
int _tmain(int argc, _TCHAR argv[])
{
boost::function<void(int *values, int n)> sum;
sum = &do_sum;
int a[] = {1,2,3,4,5};
sum(a, 5);
return 0;
}
【示例2】下面这几行代码属于独立的分开看
1、gps_.set_raw_imu_short_callback(boost::bind(&NovatelNode::RawImuHandler, this, 1, 2));
2、void set_raw_imu_short_callback(RawImuShortCallback handler){raw_imu_short_callback=handler;};
3、typedef boost::function<void(RawImuShort&, double&)> RawImuShortCallback;
4、RawImuShortCallback raw_imu_short_callback;
5、if (raw_imu_short_callback_)
raw_imu_short_callback_(raw_imu_s, read_timestamp_);
【啊哈】通过上面的示例,可以发现
funciton 定义一个局部的函数指针, RawImuShortCallback,然后函数里边都操作这个局部的函数指针变量,那么不管用户具体需要他操作的函数指针是什么样的,都不需要更改代码,只需要通过将外部的函数指针通过bind注入即可,这就是控制反转的设计思维。控制反转就是框架调用用户的代码,用户把代码传入,由框架或者engine去调用用户的代码,这样框架的代码不需要变动,提高稳定性。
bind可以传入任意的函数,非常灵活