Проблема повторного использования кода с шаблоном Vector класса для 3D математики - PullRequest
1 голос
/ 24 марта 2011

У меня есть шаблон Vector class для 3D vector math.Я хотел бы иметь варианты этого класса другого типа и размера (например, Vec2i, Vec2f, Vec3i, Vec3f) и иметь возможность конструировать одно из другого, например так:

Vec2i v(1, 2);
Vec3f u = Vec3f(v, 0);

В настоящее время яесть несколько конструкторов в Vector для выполнения этого.Однако кажется неправильным разрешать конструирование Vec4 таким же образом, как указано выше:

Vec4f t = Vec3f(v, 0)

Я хотел бы иметь отдельные классы для вариантов Vec2 *, Vec3 *, Vec4 *, но это означает, чтодублирование кодаКак мне это сделать?Наследование от базового класса Vector?Реализовать каждый вариант в терминах исходного класса Vector (т. Е. Класс Vector является закрытым членом каждого варианта)?

Ответы [ 3 ]

1 голос
/ 24 марта 2011

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.

1 голос
/ 24 марта 2011

Как то так?

template <int size, typename T>
struct Vec
{
    Vec<size, T>() {}
    Vec<size, T>(Vec<size-1, T>, T val) {} // here's the fun
};

typedef Vec<2, float> Vec2f;
typedef Vec<3, float> Vec3f;
typedef Vec<4, float> Vec4f;
// ...

int main()
{
    Vec2f john;
    Vec3f casey(john, 0);
    Vec4f chuck(casey, 0);

    return 0;
}
1 голос
/ 24 марта 2011

Используйте шаблоны.Это полностью не проверено.

template <int N>
struct Vec
{
    Vec(const Vec<N - 1>& smaller_vec, double v) { std::copy(&smaller_vec.values[0], &smaller_vec.values[0] + N-1, &values[0]); values[N-1] = v; }

    double values[N];
};

template <>
struct Vec<1>
{
    Vec(double v) { values[0] = v; }

    double values[1];
};

Vec<3> v3(Vec<2>(Vec<1>(5), 6), 7);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...