使用C ++可以做一个奇怪的事情(您没有指定语言,并且这个答案主要是因为我认为很高兴看到替代方法,尽管我真的不认为这在大多数情况下很有用。)
使用模板,您可以执行以下操作:
template <class T, class S, int U>
class VectorN
{
protected:
int _vec[U];
public:
S& operator+=(const S c)
{
for(int i = 0; i < U; i++)
{
_vec[i] += c.at(i);
}
return (S&)*this;
}
int at(int n) const
{
return _vec[n];
}
};
template <class T>
class Vec2 : public VectorN<T,Vec2<T>,2>
{
public:
T& x;
T& y;
Vec2(T a, T b) : x(this->_vec[0]), y(this->_vec[1])
{
this->_vec[0] = a;
this->_vec[1] = b;
}
};
template <class T>
class Vec3 : public VectorN<T,Vec3<T>,3>
{
public:
T& x;
T& y;
T& z;
Vec3(T a, T b, T c) : x(this->_vec[0]), y(this->_vec[1]), z(this->_vec[2])
{
this->_vec[0] = a;
this->_vec[1] = b;
this->_vec[2] = c;
}
};
可以这样使用:
int main(int argc, char* argv[])
{
Vec2<int> v1(5,0);
Vec2<int> v2(10,1);
std::cout<<((v1+=v2)+=v2).x;
return 0;
}
就像我说的那样,我认为这没有用,当您尝试实现点/归一化/其他内容并尝试与任意数量的向量通用时,这可能会使您的生活变得复杂。