对于尴尬的标题感到抱歉,用词语来说很难。 我想知道的是:
假设我有一个模板类,例如
template<typename T, int height, int width> class GMatrix
我希望重载*运算符以便与矩阵相乘。当然,所讨论的两个矩阵不需要具有相同的宽度和高度,只要右手矩阵的高度等于左手矩阵的宽度。
基本上我希望这种功能成为可能:
GMatrix<float, 3, 3> left;
GMatrix<float, 3, 6> right;
GMatrix<float, 3, 6> result = left * right;
是否可以编写这样的功能?如果是这样,那么语法可能是什么样的呢?
感谢阅读。
答案 0 :(得分:2)
一种可能的方法是在两个操作数的维度中使operator*
成为模板函数,如下例所示:
template<typename T, int height, int width>
class GMatrix {
};
template<typename T, int h1, int w1, int h2, int w2>
GMatrix<T, h1, w2>
operator*(GMatrix<T, h1, w1> const& a, GMatrix<T, h2, w2> const& b) {
return GMatrix<T, h1, w2>(); // Or do something else
}
int main() {
GMatrix<float, 3, 3> left;
GMatrix<float, 3, 6> right;
GMatrix<float, 3, 6> result = left * right;
}
您还可以在参数级别强制执行矩阵维度:
template<typename T, int h1, int wh, int w2>
GMatrix<T, h1, w2>
operator*(GMatrix<T, h1, wh> const& a, GMatrix<T, wh, w2> const& b) {
return GMatrix<T, h1, w2>(); // Or do something else
}
答案 1 :(得分:2)
即使在C ++ 03标准中也是如此。你想要的原型是
template<typename T, int h_left, int w_left, int h_right, int w_right>
GMatrix<T, h_left, w_right>
operator*(const GMatrix<T, h_left, w_left>& left, const GMatrix<T, h_right, w_right>& right);
为了清晰起见,我有一个w_left == h_right
的静态断言。