了解模板代码膨胀

ste*_*lla 5 c++ templates

我正在阅读 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),它不依赖于模板参数。因此,它会导致代码膨胀。这不是我们试图消除的东西吗?我错过了什么?

Ton*_*roy 4

因此,在我们的示例中SquareMatrixBase<T>::invert(std::size_t),它不依赖于模板参数。因此,它会导致代码膨胀。这不是我们试图消除的东西吗?我错过了什么?

invert不。您错过了在矩阵上执行的操作将依赖于 ,因此为每个 都有T一个实例化是合适的。invertT

希望对类型T和矩阵大小的每一种组合都有一个实例化n,这就是为什么派生SquareMatrix类(在这两个参数上进行模板化)遵循基类的实现。它实际上只是将矩阵大小常量作为运行时值注入。