目的:
本节记录的是学习muduo源码和相关博客过程中,个人积累的一些代码片段,方便查询。
按照原文所讲,基于对象(Object Based)的编程风格比面向对象(Object Oriented)的编程风格在拓展性上更好。
bind基本用法:
#include <functional>
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
using namespace std;
using namespace std::placeholders;
class test
{
public:
test(int i):m_i(i){}
void add(const int step)
{
m_i = m_i + step;
}
void print()
{
cout << m_i << endl;
}
private:
int m_i;
};
void add(const int step, int & elem)
{
elem = elem + step;
}
int main(int argc, char ** argv)
{
vector<test*> v{&test(2), &test(5), &test(4), &test(7)};
for_each(v.begin(), v.end(), std::bind(&test::add, _1, 10));
for_each(v.begin(), v.end(), std::bind(&test::print, _1));
vector<int> vint{1,3,4,5,7};
for_each(vint.begin(), vint.end(), std::bind(add, 10, _1));
for_each(vint.begin(), vint.end(), [](const int &elem){
cout << elem << endl;
});
system("pause");
return 0;
}
如果没有boost::bind,那么boost::function就什么都不是,而有了bind(),“同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为”,简直就无敌了。
struct Server{
typedef function < void() > sendCallBack;
void send()
{
if (sendcb)
{
sendcb();
}
else
{
cout << "default send" << endl;
}
}
void setSendCallBack(const sendCallBack& cb)
{
sendcb = cb;
}
private:
sendCallBack sendcb;
};
void send1()
{
cout << "send1" << endl;
}
void send2()
{
cout << "send2" << endl;
}
struct Sender{
void send(int i)
{
cout << "Sender send..." <<i<< endl;
}
};
int main(int argc, char ** argv)
{
// s1 s2 s3是Server类的不同对象,其发送行为send委托给不同的实现
Server s1;
s1.setSendCallBack(std::bind(send1));
s1.send();
// 绑定到自由函数
Server s2;
s2.setSendCallBack(send2);
s2.send();
// 绑定到类的成员函数
Server s3;
Sender s;
s3.setSendCallBack(std::bind(&Sender::send,&s, 100));
s3.send();
system("pause");
return 0;
}
网友评论