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;
}
私が言ったように、これは有用ではないと思います。そして、ドット/正規化/他のものを実装して、任意の数のベクトルでジェネリックにしようとすると、おそらくあなたの人生を複雑にします。