膨脹的template class成員函數

前提:

//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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章