我正在阅读Scott Meyers C++,并遇到了所谓的代码膨胀的概念。他提供了一个如何通过继承减少它的示例:
template <typename T>
class SquareMatrixBase{
protected:
void invert(std::size_t matrixSize); // <------------ HERE
}
template <typename T, std::size_t n>
class SquareMatrix : private SquareMatrixBase<T>{
private:
using SquareMatrix<T>::invert;
public:
void invert(){ invert(n) }
}
现在,他在项目摘要中说:
因此,在示例中,我们有
SquareMatrixBase<T>::invert(std::size_t)
,它不依赖于模板参数。因此,这会导致代码膨胀。那不是我们试图消除的东西吗?我错过了什么? 最佳答案
不会。您错过了invert
在矩阵上执行的操作将取决于T
,因此对于每个invert
都有一个T
实例化是合适的。
对于T
类型和矩阵大小n
的每种组合都没有一个实例化是不希望的,这就是为什么派生的SquareMatrix
类(在这两个参数上都模板化)遵从基类的实现的原因。它实际上只是将矩阵大小常量作为运行时值注入(inject)。