使用模板 C++ 重载运算符

Overloading operator using templates c++

本文关键字:重载 运算符 C++      更新时间:2023-10-16

我正在制作一个矩阵库,我希望能够做类似的事情

Matrix<double> = Matrix<int> + Matrix<double>

这可能吗?

这是我现在拥有的:

template<typename T>
Matrix<T>& Matrix<T>::operator+(const Matrix& rhs) {
if(w != rhs.w || h != rhs.h) {
printf("e[31m[ERROR] Arithmetic Error: attempted to add %dx%d matrix to %dx%d matrixe[0mn", w, h, rhs.w, rhs.h);
}
else {
for(uint32_t i = 0;i < size;++i) {
m[i] += rhs.m[i];
}
}
return *this;
}

您可以制作operator+模板,然后它可以接受Matrix的其他实例化。

例如

template<typename T>
template<typename X>
Matrix<T>& Matrix<T>::operator+(const Matrix<X>& rhs) {
if(w != rhs.w || h != rhs.h) {
printf("e[31m[ERROR] Arithmetic Error: attempted to add %dx%d matrix to %dx%d matrixe[0mn", w, h, rhs.w, rhs.h);
}
else {
for(uint32_t i = 0;i < size;++i) {
m[i] += rhs.m[i];
}
}
return *this;
}

请注意,对于当前的实现,您必须确认允许当前实例化访问其他实例化(如rhs.w(的成员。不同的实例化被视为不同的类型。

模板免费函数可能会解决您的问题,例如:

template <typename T1, typename T2>
auto operator+(const Matrix<T1>& lhs, const Matrix<T2>& rhs)
{
if (lhs.w != rhs.w || lhs.h != rhs.h) {
throw std::runtime_error("Incompatible size");
}
using T = decltype(std::declval<T1>() + std::declval<T2>());
Matrix<T> res(lhs.w, lhs.h);
for (uint32_t i = 0; i != res.size; ++i) {
res.m[i] = lhs.m[i] + rhs.m[i];
}
return res;
}