将与参数无关的代码抽离templates
存在这样一种类:
template<class T,int n>
class A
{
public:
...
int func()
{
...
cout << n * n << endl;
}
};
和这样的两种实例化对象:
A<int, 5> a1;
a1.func();
A<int, 10> a2;
a2.func();
这些看起来非常合法,但是这会具现化两个类,使代码膨胀,仅仅是因为n不同,其他部分完全相同。这样改进会解决这个问题:
template<class T>
class B
{
protected:
void func(int n)
{
...
}
};
template<class T,int n>
class A :private B<T>
{
private:
using B<T>::func;
public:
void func()
{
this->func();
}
};
注:
1.使用this->func和func的效果不一样。因为基类是protected,并且是私有继承,所以子类无法访问到基类的函数,所以需要this->func
2.私有继承的意义是表示派生类只是为了帮助基类实现,不是为了表示它们之间的is-a关系
3.这样写就能解决代码膨胀问题。