是否可以编写一个带有不同初始化的模板参数的函数

时间:2015-06-03 14:59:50

标签: c++ templates

对于尴尬的标题感到抱歉,用词语来说很难。 我想知道的是:

假设我有一个模板类,例如

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;

是否可以编写这样的功能?如果是这样,那么语法可能是什么样的呢?

感谢阅读。

2 个答案:

答案 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的静态断言。