模板函数指针

 

比较讨厌模板,所以都不希望整个类都感染,只让部分函数有模板功能。

所以下面code是一个不需要将类声明为模板类,却又可以保留模板函数为成员变量的一个例子。

 

第17行声明一个通用指针用于保存每个对象对应不同的函数指针,便于在线程中使用该变量。

第44行将一个模板函数指针转化给一个通用的类指针保存,然后在线程里面通过类对象将该对象绑定的CB在线程里面使用。

第32行在线程内将类的通用指针转换为对应的模板函数指针,然后提供给类的另外一个函数调用,也可以直接在该函数内调用该成员变量。

 

 1 class mwProData {    
 2      public:
 3         template <typename T>
 4         int32_t CreateData(    
 5                 ...
 6                 void (*callback)(const T &dat));
 7         
 8         void* GetCallBack(void) {
 9             return m_pCallBack;
10         }
11 
12        template <typename T>
13        void WaitSet(void (*callback)(const T &dat));
14 
15     private:
16        ...
17        void *m_pCallBack;
18 };
19 
20 template <typename T>
21 void *__MW_DATAREAD_RunData(void *arg)
22 {
23     pthread_detach(pthread_self());
24     mwProData *pReader = (mwProData *)arg;
25 
26     void *pCb = pReader->GetCallBack();
27     if (pCb == NULL) {
28         printf("mwProData::GetCallBack() return NULL\n");
29         return NULL;
30     }
31 
32     pReader->WaitSet<T>((void (*)(const T&))pCb);
33 
34     return NULL;
35 }
36 
37 template <typename T>
38 int32_t mwProData::CreateData(
39         ...  
40         void (*callback)(const T &dat))
41 {
42     pthread_t tid;
43     ...      
44     this->m_pCallBack = (void *)callback;
45     pthread_create(&tid, NULL, __MW_DATAREAD_RunData<T>, (void *)this);
46     ...
47 }

 

posted @ 2021-01-26 12:14  sciapex  阅读(661)  评论(0编辑  收藏  举报