实习的第二天,我的任务是做一个万能的函数注册和调用,这个任务设计到了许多的知识点,我觉得主要是要掌握,数据隐藏的方法。
我下面写的主要是类中函数的注册,类外函数的注册,其实类似。
8 #include <iostream>
9 #include <functional>
10 #include <string>
11 #include <map>
12 #include <memory>
13 using namespace std;
14
15 class Base{
16 public :
17 Base(){
18 }
19
20 virtual ~Base(){
21
22 }
23 };
24
25 template<typename Ret,class C,typename...Args>
26 class Derived : public Base{
27 public :
28 C obj; //用于保存类的对象
29 function<Ret(C&,Args...)> fun; //保存函数
30 public :
31 Derived(Ret (C::*f)(Args...),C obj):obj(obj),fun(f){ //构造函数
32
33 }
34 ~Derived(){
35
36 }
37 };
38 class function_factory{
39 private:
40 map<string,unique_ptr<Base> > m; //一个string函数名字,对应一个函数调用(采用智能指针)
41 public :
//函数注册
42 template<typename Ret,class C,typename... Args>
43 bool register_function(const string& k,Ret (C::*f)(Args...),C *obj){
44 if(m[k] != nullptr){ //判断该名的函数是否已被注册
45 return false;
46 }
//没有被注册,则会将该函数注册到map中
47 m[k] = make_unique<Derived<Ret,C,Args...>>(f,*obj);
48 return true;
49 }
50
//函数的调用,
51 template<typename Ret,typename T,class C,typename...Args>
52 Ret call(const string& k,Args...args){
//通过dynamic_cast 从父类到模板子类中,从而获取其对象和其函数地址
53 Derived<T,C,Args...> d = (dynamic_cast<Derived<T,C,Args...>& >(*m[k]));
54 return d.fun(d.obj,args...);
55 }
56 };
57
58 struct A {
59 int add(int a,int b){
60 return a + b;
61 }
62 };
63
64 int main(){
65 function_factory fac;
66 A aa;
67 fac.register_function("add",&A::add,&aa);
68 cout << fac.call<int,int,A>("add",1,2) << endl;
69 return 0;
70 }
~