我正在阅读 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) }
}
Run Code Online (Sandbox Code Playgroud)
现在,在该项目的摘要中,他指出
模板生成多个类和多个函数,因此任何不依赖于模板参数的模板代码都会导致膨胀。
因此,在我们的示例中SquareMatrixBase<T>::invert(std::size_t)
,它不依赖于模板参数。因此,它会导致代码膨胀。这不是我们试图消除的东西吗?我错过了什么?
因此,在我们的示例中
SquareMatrixBase<T>::invert(std::size_t)
,它不依赖于模板参数。因此,它会导致代码膨胀。这不是我们试图消除的东西吗?我错过了什么?
invert
不。您错过了在矩阵上执行的操作将依赖于 ,因此为每个 都有T
一个实例化是合适的。invert
T
不希望对类型T
和矩阵大小的每一种组合都有一个实例化n
,这就是为什么派生SquareMatrix
类(在这两个参数上进行模板化)遵循基类的实现。它实际上只是将矩阵大小常量作为运行时值注入。