刚开始看protobuf的时候把这些关键部分提出来写一遍,大概的思想和代码逻辑就能理清楚了
#include <iostream>
#include <functional>
using namespace std;
class Closure
{
public:
Closure() {};
~Closure() {};
virtual void Run() = 0;
};
template<typename Class, typename Arg1, typename Arg2>
class MethodClosure2 : public Closure
{
public:
typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2);
MethodClosure2(Class* object, MethodType method, bool self_deleting,
Arg1 arg1, Arg2 arg2) :object_(object), method_(method), self_deleting_(self_deleting),
arg1_(arg1), arg2_(arg2) {}
~MethodClosure2() {}
void Run()
{
(object_->*method_)(arg1_, arg2_);
if (self_deleting_)
{
delete this;
}
}
private:
Class* object_;
MethodType method_;
bool self_deleting_;
Arg1 arg1_;
Arg2 arg2_;
};
template<typename Class, typename Arg1, typename Arg2>
Closure* NewCallBack(Class *object, void (Class::*method)(Arg1, Arg2), Arg1 arg1, Arg2 arg2)
{
return new MethodClosure2<Class, Arg1, Arg2>(object, method, true, arg1, arg2);
}
class A
{
public:
A() {}
void RPCCallBack(int arg1, int arg2)
{
cout << arg1 << " " << arg2 << endl;
}
};
int main(int argc, char* argv[])
{
A *a = new A();
auto done = NewCallBack(a, &A::RPCCallBack, 3, 4);
done->Run();
system("pause");
return 0;
}
在源码的基础上用C++11的function和bind把原有的函数指针代替了,代码如下
#include <iostream>
#include <functional>
using namespace std;
class Closure
{
public:
Closure() {};
~Closure() {};
virtual void Run() = 0;
};
template<typename Arg1, typename Arg2>
class MethodClosure2 : public Closure
{
public:
typedef std::function<void(Arg1, Arg2)> MethodType;
MethodClosure2(MethodType method, bool self_deleting,
Arg1 arg1, Arg2 arg2) :method_(method), self_deleting_(self_deleting),
arg1_(arg1), arg2_(arg2) {}
~MethodClosure2() {}
void Run()
{
method_(arg1_, arg2_);
if (self_deleting_)
{
delete this;
}
}
private:
MethodType method_;
bool self_deleting_;
Arg1 arg1_;
Arg2 arg2_;
};
template<typename Arg1, typename Arg2>
Closure* NewCallBack(std::function<void (Arg1, Arg2)> func, Arg1 arg1, Arg2 arg2)
{
return new MethodClosure2<Arg1, Arg2>(func, true, arg1, arg2);
}
class A
{
public:
A() {}
void RPCCallBack(int arg1, int arg2)
{
cout << arg1 << " " << arg2 << endl;
}
};
int main(int argc, char* argv[])
{
A *a = new A();
std::function<void(int, int)> func = std::bind(&A::RPCCallBack, a, std::placeholders::_1, std::placeholders::_2);
auto done = NewCallBack(func, 3, 4);
done->Run();
system("pause");
return 0;
}