Vec2 и Vec3 - это совершенно разные IMO. Какое повторное использование кода вы бы ожидали, если бы они были связаны?
Для различных встроенных типов просто используйте классы шаблонов и конструкторы шаблонов:
template<typename T1>
struct Vec2 {
Vec2(T1 const & X, T1 const & Y) : x(X), y(Y) {}
template <typename T2>
Vec2(Vec2<T2> const & V) {
x = static_cast<T1>(V.x);
y = static_cast<T1>(V.y);
}
T1 x, y;
};
template<typename T1>
struct Vec3 {
Vec3(T1 const & X, T1 const & Y, T1 const & Z) : x(X), y(Y), z(Z) {}
template <typename T2>
Vec3(Vec3<T2> const & V) {
x = static_cast<T1>(V.x);
y = static_cast<T1>(V.y);
z = static_cast<T1>(V.z);
}
template <typename T2, typename T3>
Vec3(Vec2<T2> const & V, T3 const & Z) {
x = static_cast<T1>(V.x);
y = static_cast<T1>(V.y);
z = static_cast<T1>(Z);
}
T1 x, y, z;
};
Если вы хотите связать Vec2 и Vec3, пусть шаблон Vec3 наследует шаблон Vec2, а затем скройте функции, которые нужно переписать для Vec3.