《Effective C++》条款44

将与参数无关的代码抽离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.这样写就能解决代码膨胀问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值