前提:函數
//2個不一樣的array類 std::array<int,10> arr10; std::array<int,5> arr5;
如要編寫如上的template classcode
template <typename T ,std::size_t length> class XArr { ... public: void insert() {} }; XArr<int,10> a10; //產生一個XArr<int,10> class XArr<int,5> a5; //產生XArr<int,5> a10.insert() //產生一個實現 a5.insert() //又一個實現
將產生2個類, 2份insert實現(若是有調用的話)
膨脹的template class 的緣由是參數
所以讓目標代碼膨脹減小的方法是,提取一個template父類:io
//一個模版父類,須要用到的函數放在這兒 template < typename T> class XBase{ public: void insert() {} //類型一致的公用一套代碼 }; template <typename T ,std::size_t length> class XArr : public XBase<T>{ public: void test() { cout << __FUNCTION__ << endl;} }; XArr<int,10> a10; //產生一個XArr<int,10> class XArr<int,5> a5; //產生XArr<int,5> a10.insert() //XBase<int>::insert a5.insert() //與上面的insert 同一實現
雖然沒法減小XArr 類的實例化 ,至少減小了insert函數的實例化
簡單驗證一下:class
union{ void (XArr<int,10>::*pfunc1)(); void (XArr<int,5>::*pfunc2)(); int addr; } up; up.pfunc1= &XArr<int,10>::test; //XArr 本身的函數將生成2份 cout << up.addr << endl; up.pfunc2 = &XArr<int,5>::test; cout << up.addr << endl; up.pfunc1= &XArr<int,10>::insert; //TBase<int> 的insert 只有一份 cout << up.addr << endl; up.pfunc2 = &XArr<int,5>::insert; cout << up.addr << endl;