一、模板类作为进程类的指针成员(指向进程运行过程函数的地址)
我们在这里定义了三个类:函数基类CFuncitonBase,模板函数类CFunction(公有继承CFuntionBase),以及进程类Myprocess。
目的是实现进程函数的外部初始化:通过Myprocess类内的SetFunction模板函数和模板函数类CFunction的构造函数相配合,在外部确定类对象的实际运行函数。调用过程如下图所示:
using namespace std;
int sum(int a, int b) {
cout << a << endl;
cout << b << endl;
return a + b;
}
class CFunctionBase {
private:
public:
virtual ~CFunctionBase() {}
virtual int operator()() { return 0; };
};
template<typename _FUNCTION_,typename... _ARGS_>
class CFunction:public CFunctionBase {
public:
~CFunction() {}
int operator()() {return m_binder();}
CFunction(_FUNCTION_ func, _ARGS_... args)
:m_binder(std::forward<_FUNCTION_>(func), std::forward<_ARGS_>(args)...) {
}
typename std::_Bindres_helper<int, _FUNCTION_, _ARGS_...>::type m_binder;
};
class MyProcess {
private:
CFunctionBase* m_func = nullptr;
public:
template<typename _FUNCTION_, typename... _ARGS_>
int SetFunction(_FUNCTION_ func, _ARGS_... args) {
m_func = new CFunction<_FUNCTION_, _ARGS_...>(func, args...);
return 0;
}
int Start() {
pid_t pid = fork();
if (pid == 0) {
(*m_func)();
exit(0);
}
//注意父进程还会从这里运行下去,这个过程是异步的,相当于if(pid>0) return;
}
public:
MyProcess() {}
~MyProcess() { m_func = nullptr; }
};
int main() {
MyProcess process;
process.SetFunction(sum,1,2);
process.Start();
return 0;
}
注意点
- std::bind函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。bind的思想实际上是一种延迟计算的思想,将可调用对象保存起来,然后在需要的时候再调用。而且这种绑定是非常灵活的,不论是普通函数、函数对象、还是成员函数都可以绑定,而且其参数可以支持占位符,比如你可以这样绑定一个二元函数auto f = bind(&func, _1, _2);,调用的时候通过f(1,2)实现调用。
- Myprocess类内存在一个CFunctionBase* my_func指针对象(若CFunctionBase存在纯虚函数则为抽象类,