模板函数指针
比较讨厌模板,所以都不希望整个类都感染,只让部分函数有模板功能。
所以下面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 }