前提:
//2個不同的array類
std::array<int,10> arr10;
std::array<int,5> arr5;
如要編寫如上的template class
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父類:
//一個模版父類,需要用到的函式放在這兒
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函式的例項化
簡單驗證一下:
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;