I made a Vector<numType, numberOfCoords> class. I was happy with it, it's kinda weird but it seemed to work at the start. But I just found out copying the vectors is impossible.
The reason is that to allow the number of coordinates to be a template, there is a templated variadic constructor which expects the right number of coordinates.
This is what it looks like, with the utility math methods removed:
template <typename NumType, unsigned char Size>
class Vector
{
public:
using CoordType = NumType;
//Vector(const Vector& v) : values(v.values) {}
//Vector(Vector&& v) : values(std::move(v.values)) {}
template<typename... NumTypes>
constexpr Vector(NumTypes&&... vals) : values{ std::forward<NumTypes>(vals)... }
{
static_assert(sizeof...(NumTypes) == Size, "You must provide N arguments.");
}
Vector(const std::array<NumType, Size>& values) : values(values) {}
Vector(std::array<NumType, Size>&& values) : values(std::move(values)) {}
const NumType& operator[](size_t offset) const { return values[offset]; }
NumType& operator[](size_t offset) { return values[offset]; }
//Vector& operator=(const Vector& other) { values = other.values; }
//Vector& operator=(Vector&& other) { values = std::move(other.values); }
std::array<NumType, Size> values;
};
As you can see - now commented out - I did try to implement copy and move and assignment operations manually. It had no effect, the error is always along the lines of:
cannot convert ‘Vector<int, 3>’ to ‘int’ in initialization
This is because it is still trying to use the variadic constructor, instead of the copy constructor.
Here is a full working broken sample: https://ideone.com/Jz86vP