我正在阅读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)。

09-06 06:25