gpt4 book ai didi

c++ - 相似类型类的设计

转载 作者:行者123 更新时间:2023-11-30 04:48:22 25 4
gpt4 key购买 nike

我正在设计类来表示几何对象,例如 vector 。我需要定义加法、标量乘法、点积等方法。 vector 坐标可以是不同大小的整数或实数,因此需要复制这些不同类型对应的类。

例如

class intVector
{
int X, Y;

intVector& operator+=(const intVector& A) { … }
intVector& operator*=(int A) { … }

float Norm(); // Not int
};

class floatVector
{
float X, Y;

floatVector& operator+=(const floatVector& A) { … }
floatVector& operator*=(float A) { … }

float Norm(); // Would be double for a doubleVector
};

(我还需要定义为函数而不是方法的二元运算符。)

我想避免/尽量减少代码重复,因此使用模板似乎是一种自然的方法。无论如何,我希望我的类显示为普通类,而不是模板化类(一种选择是从模板化类派生;另一种是 typedef 类特化)。

此外,还有一个令人讨厌的约束:并非所有方法都对所有数据类型都有意义,并且根本不应该在某些类中声明,或者某些参数的类型可能存在特殊情况。

在我尝试的过程中,我遇到了许多问题,例如需要添加大量显式实例化、难以避免没有意义的成员、基类/派生类之间的转换问题……使整个设计变得痛苦。总而言之,我使用模板编写的代码比不使用模板时花费的更多!

你经历过类似的类设计吗?有解决这个问题的经典方法吗?

最佳答案

模板是处理这个问题的正确方法。您可以做的是为需要不同行为的不同函数添加重载并使用 SFINAE将它们限制为所需的类型。使用模板,我们可以将这两个类组合成一个通用的 Vector 类,然后使用 type alias获取不同类型的具体名称。看起来像

template<typename T>
class Vector
{
T X, Y;

Vector& operator+=(const Vector& A) { … }
Vector& operator*=(T A) { … }

template<typename U = T, std::enable_if_t<std::is_integral_v<U>, bool> = true>
correct_size_floating_point_type<U> Norm() { integer code }
template<typename U = T, std::enable_if_t<std::is_floating_point_v<U>, bool> = true>
U Norm() { floating point code }
};

using intVector = Vector<int>;
using floatVector = Vector<float>;

其中 correct_size_floating_point_type 是一个模板类型,它为提供的整数类型返回正确大小的浮点类型。

关于c++ - 相似类型类的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55835395/

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