我們平時寫一個模板類,聲明大概如下
template <typename T><br />class TaskManager<br />{<br /> vector<T> tasks;<br /> void ParseEveryTask()<br /> {<br /> vector<T>::iterator it = tasks.begin();<br /> while ( it!=tasks.end() )<br /> {<br /> it->parse();//注意,T必須有parse方法<br /> ++ it;<br /> }<br /> }<br />}<br />
怎麼能確保傳進來的T擁有parse方法呢?模版類的很多方法是在調用時執行個體化,所以如果沒有parse方法,編譯期不報錯
我用C語言的宏鼓搗了一個解決方案~如果沒有parse,編譯就報錯
#define DECLARE_BASE_CONSTRAINTS(Suffix,Fname,Rtype)/<br />template <typename Class> /<br />class Constraints_##Suffix /<br />{ /<br /> static void constraint() /<br /> { /<br /> Rtype (Class::*p)() = &Class::Fname; /<br /> (void)p; /<br /> } /<br />protected: /<br /> Constraints_##Suffix() /<br /> { /<br /> void (* test)() = &constraint; /<br /> } /<br />}</p><p>#define BASE_NAME(Suffix) Constraints_##Suffix
上面的宏定義僅限定參數類必須有一個傳回型別為Rtype、空參數的名字為Fname的函數;
要想支援多個參數,再多寫幾個類似的宏
使用方法如下:
假設有一個TCPTask類,它含有一個void parse()方法</p><p>DECLARE_BASE_CONSTRAINS(123,parse,void);</p><p>template <typename T><br />class TaskManager : BASE_NAME(123)<T><br />{<br /> vector<T> tasks;<br /> void ParseEveryTask()<br /> {<br /> vector<T>::iterator it = tasks.begin();<br /> while ( it!=tasks.end() )<br /> {<br /> it->parse();//如果T沒有parse方法,編譯早已報錯<br /> ++ it;<br /> }<br /> }<br />}<br />