gpt4 book ai didi

c++ - 可以更改模板参数吗?

转载 作者:行者123 更新时间:2023-11-30 02:17:41 26 4
gpt4 key购买 nike

我编写了以下 Matrix 类:

template <typename T, size_t r, size_t c> //r=rows,c=cols of the Matrix
class Matrix {
public:
size_t row = 0;
size_t col = 0;
T *data;

template <size_t L>
Matrix<T, r, L> operator*(const Matrix<T, c, L> &other) const;

template <size_t r, size_t c>
Matrix &operator=(const Matrix<T, r, c> &other)

// ...
};

我覆盖了一些运算符来做一些基本的算术运算,一切似乎都正常工作——但是有一个我不知道如何正确解决的问题:给定以下代码行:

  Matrix<double, 1, 4> m1(1.2);
Matrix<double, 4, 1> m2(1.2);
Matrix<double, 2, 2> m3; // problematic line
m3 = m1 * m2;

m3类型为 Matrix<double, 2, 2> , 被正确计算,有一行和一列并带有 5.76 , 但保持为 Matrix<double, 2, 2> .它的行数和列数的变化不会反射(reflect)在它的模板参数中。然而,自然地,我希望该类型也能提供有关其内容的信息。

我不认为一个人不能转动 Matrix<double, 2, 2>突然变成Matrix<double, 1, 1> Matrix,但也许有一个我现在想不到的好解决方案。

并替换:

 template <size_t r, size_t c> void replace(const Matrix<T, r, c> &other) {
delete[] data;
row = other.row; //number of rows of a matrix
col = other.col; //number of cols of a matrix
data = new T[col * row]; // data contains all the elements of my matrix
for (size_t i = 0; i < row * col; i++)
data[i] = other.data[i];
}

最佳答案

来自你的声明

template <typename T, size_t r, size_t c> //r=rows,c=cols of the Matrix
class Matrix {
public:
template <size_t L>
Matrix<T, r, L> operator*(const Matrix<T, c, L> &other) const;

template <size_t r, size_t c> // BEWARE: shadowing
Matrix &operator=(const Matrix<T, r, c> &other);

// ...
};

我们可以猜到会发生什么。

Matrix<double, 1, 4> m1(1.2);
Matrix<double, 4, 1> m2(1.2);
m1 * m2; // (1)

(1)电话 Matrix<double, 1, 4>::operator*<1>(Matrix<double, 4, 1> const&) .结果是输入 Matrix<double, 1, 1> .

Matrix<double, 2, 2> m3;
m3 = /* (2) */ m1 * m2;

(2)电话 Matrix<double, 2, 2>::operator=<1, 1>(Matrix<double, 1, 1> const&) .这是一个问题。

解决方案是确保 operator=只能用另一个正确大小的矩阵调用:

template <typename T, size_t r, size_t c> //r=rows,c=cols of the Matrix
class Matrix {
public:
template <size_t L>
Matrix<T, r, L> operator*(Matrix<T, c, L> const& other) const;

Matrix &operator=(Matrix const& other);

// ...
};

您甚至可以允许类型转换:

template<class U>
Matrix &operator=(Matrix<U, r, c> const& other);

最后,您可能想使用 auto :

Matrix<double, 1, 4> m1(1.2);
Matrix<double, 4, 1> m2(1.2);
auto m3 = m1 * m2; // m3 is Matrix<double, 1, 1>

关于c++ - 可以更改模板参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com