【发布时间】:2015-09-02 18:39:46
【问题描述】:
我想实现数字Vector,它有几个数字运算。
我使用模板来定义矢量的通用版本。
但是具体实现应该与Vector3这样的具体实现不同。
例如,+ 操作如下所示。
Vector3 实现
Vector3 operator+(const Vector3& vec3) const{
return Vector3(data[0]+vec3.data[0], data[1]+vec3.data[1], data[2]+vec3.data[2]);
}
模板实现
GenericVector operator+(const GenericVector<T,N>& vec) const{
GenericVector temp = *this;
for(int i=0;i<N;i++)
{
temp.data[i] += vec.data[i];
}
return temp;
}
现在我们不知道它会有多少data,我们不能定义像Vector3(x,y,z) 这样的构造函数。这就是我在+ operator重载中引入for循环的原因。
实际上,在代码外观方面,Vector3 的实现看起来更好。但它不能缩放到不同大小的向量。
模板的实现看起来不如Vector3 好。但是模板版本可以通过这样做轻松地缩放到许多大小的向量。
typedef GenericVector<double, 3> Vector3d;
typedef GenericVector<double, 6> Vector6d;
我不习惯 C++ 的模板。有没有人可以指出我的实施或理解的问题?
我的问题是,在模板版本中实现+ operator,是选择引入for循环来容纳未知整数N对还是唯一的选择 ?
简单的一个问题,
我可以避免 + operator 中的 for 循环吗?
这是我的代码的一部分。
template <typename T, int N>
class GenericVector{
protected:
T data[N];
public:
GenericVector()
{
for(int i=0;i<N;i++)
{
data[i] = static_cast<T>(0);
}
}
GenericVector operator+(const GenericVector<T,N>& vec) const{
GenericVector temp = *this;
for(int i=0;i<N;i++)
{
temp.data[i] += vec.data[i];
}
return temp;
}
//...
};
【问题讨论】:
-
那么问题是什么?它不起作用还是您在问这是否是正确的方法?
-
您不需要在循环中将
data初始化为0。您只需要GenericVector(): data() {}。而且您不需要operator+参数中的模板参数。这样做:GenericVector operator+(const GenericVector& vec) const。除此之外,它看起来还可以。但我不知道你在问什么。 -
另外,您可能应该实现
GenericVector& operator+=(const GenericVector&)并在operator+中使用它。 -
谢谢,@juanchopanza。我确实实现了 '+=' 但为了简单起见这里省略:D.
标签: c++ templates vector generic-programming