前提:
//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;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。