Я создал класс 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;
}
};
Я хочу иметь операторы для класса, но для того, чтобы они могли выполнять преобразования между векторами с различными типами элементов, они должны быть дружественными функциями, объявленными и определенными внутри тела класса. Но я также хочу иметь 3 специализированных класса-шаблона для Vector 2, 3 и 4. Так как я не хочу писать все операторы 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;
}
Вероятно, есть причина, по которой люди используют операторы друзей внутри класса вместо того, чтобы делать это таким образом, но пока все выглядит нормально, я что-то упустил?
template <class U> foo(const foo<U>& that) : _value(that.getval()) {}
- он вызывает болезненную неявную конструкцию дополнительного вектора до того, как сработает оператор+
. Вам лучше использовать код в своем ответе. 04.01.2014