【发布时间】:2014-01-04 15:50:19
【问题描述】:
我创建了一个 Vector 类,它将元素数量和元素类型作为模板参数。
template<int n, class T>
class Vector
{
public:
T data[n];
Vector()
: data{}
{
}
Vector(T const value)
{
std::fill_n(data, n, value);
}
template<class ...U, typename std::enable_if<sizeof...(U) == n, int>::type = 0>
Vector(U &&...u)
: data{std::forward<U>(u)...}
{
}
T& operator[](int const index)
{
return data[index];
}
template<class U>
operator Vector<n, U>()
{
Vector<n, U> out;
std::copy_n(data, n, out.data);
return out;
}
};
我想要类的运算符,但是为了让它们在具有不同元素类型的向量之间进行转换,它们需要是在类体内声明和定义的友元函数。但我也想为向量 2、3 和 4 提供 3 个专门的模板类。因为我不想在每个类主体内编写所有运算符 4 次。我可以将此运算符与右侧向量的元素类型的附加模板参数一起使用吗?
template<int n, class T, class U>
inline Vector<n, T>& operator+=(Vector<n, T> &lhs, Vector<n, U> const &rhs)
{
for(int i = 0; i < n; ++i)
{
lhs.data[i] += rhs.data[i];
}
return lhs;
}
人们在类中使用友元运算符而不是这样做可能是有原因的,但到目前为止似乎还不错,我是否忽略了什么?
【问题讨论】:
标签: c++ class templates operator-overloading