Взгляните на C ++ Insights .
Если вы вставите туда свой код и добавите функцию main
, которая использует два типа матриц с разной высотой и шириной (см. здесь и нажмите кнопку «Воспроизвести»), вы можете увидеть, что компилятор генерирует:
template<typename T, int width, int height>
class Matrix
{
public:
Matrix();
template <int width2>
Matrix<T, width2, height> operator*(const Matrix<T, width2, width> rMatrix);
// other matrix operations/functions here
private:
T* data;
};
/* First instantiated from: insights.cpp:18 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
class Matrix<double, 1, 2>
{
public:
Matrix();
template<int width2>
Matrix<double, width2, 2> operator*(const Matrix<double, width2, 1> rMatrix);
private:
double * data;
public:
// inline constexpr Matrix(const Matrix<double, 1, 2> &) = default;
// inline constexpr Matrix(Matrix<double, 1, 2> &&) = default;
};
#endif
/* First instantiated from: insights.cpp:19 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
class Matrix<double, 2, 1>
{
public:
Matrix();
template<int width2>
Matrix<double, width2, 1> operator*(const Matrix<double, width2, 2> rMatrix);
private:
double * data;
public:
// inline constexpr Matrix(const Matrix<double, 2, 1> &) = default;
// inline constexpr Matrix(Matrix<double, 2, 1> &&) = default;
};
#endif
int main()
{
Matrix<double, 1, 2> Matrix1 = Matrix<double, 1, 2>();
Matrix<double, 2, 1> Matrix2 = Matrix<double, 2, 1>();
}
Следовательно, да, создаются версии для всех комбинаций ширины и высоты, используемых где-то еще в коде.