前提:
//2个不同的array类std::arrayarr10;std::array arr5;
如要编写如上的template class
templateclass XArr {...public: void insert() {}};XArr a10; //产生一个XArr class XArr a5; //产生XArr a10.insert() //产生一个实现a5.insert() //又一个实现
将产生2个类, 2份insert实现(如果有调用的话)
膨胀的template class 的原因是参数因此让目标代码膨胀减少的方法是,提取一个template父类://一个模版父类,需要用到的函数放在这儿template < typename T>class XBase{public: void insert() {} //类型一致的公用一套代码};templateclass XArr : public XBase {public: void test() { cout << __FUNCTION__ << endl;}};XArr a10; //产生一个XArr class XArr a5; //产生XArr a10.insert() //XBase ::inserta5.insert() //与上面的insert 同一实现
虽然无法减少XArr 类的实例化 ,至少减少了insert函数的实例化
简单验证一下:union{ void (XArr::*pfunc1)(); void (XArr ::*pfunc2)(); int addr; } up; up.pfunc1= &XArr ::test; //XArr 自己的函数将生成2份 cout << up.addr << endl; up.pfunc2 = &XArr ::test; cout << up.addr << endl; up.pfunc1= &XArr ::insert; //TBase 的insert 只有一份 cout << up.addr << endl; up.pfunc2 = &XArr ::insert; cout << up.addr << endl;