前提:函数
//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;