【发布时间】:2017-06-12 15:05:44
【问题描述】:
我有一个Vector 课程和一个Matrix 课程。我想使用 = 运算符将 Vector 类隐式转换为 Matrix 类。类的定义如下所示。
template <unsigned int dim>
class Vector {
public:
std::array<double, dim> x;
};
template <unsigned int nrow, unsigned int ncol>
class Matrix {
public:
std::array<Vector<ncol>, nrow> x;
auto& operator=(Vector<ncol> v)
{
x.fill(v);
return *this;
}
};
int main()
{
Vector<2> vec1;
vec1.x[0] = 1;
vec1.x[1] = 2;
Matrix<1, 2> mat1;
mat1 = vec1;
std::cout << mat1.x[0].x[0] << std::endl;
std::cout << mat1.x[0].x[1] << std::endl;
}
这可以正常工作。但是,我想介绍另一个operator=,它应该如下所示。
auto& operator=(Vector<nrow> v)
{
for(unsigned int row=0; row < nrow; ++row){
x[row].x[0] = v[row];
}
return *this;
}
但是,由于重载实例化为相同的签名(对于nrow=ncol 的情况),我不确定如何设计这样的方法。具体来说,我想知道是否只有nrow!=ncol才可以定义第二种方法。
我已经尝试通过定义两种类型来使用std::enable_if
using nrow_t = std::integral_constant<unsigned int,nrow>;
using ncol_t = std::integral_constant<unsigned int,ncol>;
然后使用std::is_same,但我不确定如何继续。
【问题讨论】:
-
enable_if看起来是解决问题的直接方法。你已经尝试过什么? -
我会重新考虑使用
operator=来执行此操作的决定,以避免给不知情的程序员带来意外。尤其是当行为取决于天气nrow == ncol与否时。 -
我强烈建议使用更有意义的函数名而不是钝的句法技巧。
fillByRow、fillByColumn、setRow和setColumn比operator=的重载含义更容易理解,具体取决于nrow和ncol的值Matrix和nrowVector. -
想了想,同意@alain。
标签: c++ templates operator-overloading overloading