gpt4 book ai didi

c++ - 用于 3D 数学的模板 Vector 类的代码重用问题

转载 作者:行者123 更新时间:2023-11-30 03:08:01 29 4
gpt4 key购买 nike

我有一个用于 3D vector 数学的模板 Vector 类。我想要此类的不同类型和大小的变体(例如 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 类是每个变体的私有(private)成员)?

最佳答案

Vec2 和 Vec3 在我看来是完全不同的,如果它们相关,您会期待什么样的代码重用?

对于不同的内置类型,只需使用模板类和模板构造函数:

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需要重写的函数。

关于c++ - 用于 3D 数学的模板 Vector 类的代码重用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423506/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com