我正在制作一个将使用数学计算的项目。此外,我希望能够简单地改变实数的实现。让我们说一下float,double,我自己的实现和gmplib float类型。
到目前为止,我有两种方式:
我创建了一个类" Number"它将与程序的其余部分接口。
我输入算术类型并编写全局函数以与程序的其余部分接口。
第一种选择似乎更优雅,但第二种似乎有更少的开销。还有第三个更好的选择吗?我也担心基本的数学函数,如正弦,余弦,exp ......我想出了为了使切换变得容易,我应该将它们作为模板实现,但是我的实现是无可救药地缓慢的。
我通常不熟悉C ++编程。我在舒适的Matlab和Mathematica环境中长大,在那里我不必担心这些事情。
答案 0 :(得分:3)
您需要使用带约束的模板以避免重新实现。
例如,假设您希望在sin
和float
中以不同方式使用double
。您可以根据类型重载并创建专门的模板。
template<class T> T MySin(const T& f) {
return genericSin(f);
}
template<> float MySin<float>(float f) {
return sinf(f);
}
template<> double MySin<double>(double d) {
return sin(d);
}
对于功能。如果您想要进行OO路由,则在部分特化Math
类时语法类似。这将使您能够使用任何类型调用您的例程,并具有最专业和最有效的例程。
答案 1 :(得分:1)
模板就是我这样做的方式。它可以很容易地专门化必须专门化的东西,并提供了一种在应用于多种类型时重用实现的好方法。
数字类型可以完成,但实际上做起来并不简单,并且引入了一些限制(与模板相比)。
如果你想要一些快速,准确和易于维护的东西,那么多种类型就无可救药。如果您要创建全局typedef
。
模板提供了您需要的所有功能,控制和灵活性,并且它们将比发布的替代方案更快(从技术上讲,如果您使用...模板,#2可能会更快)。
答案 2 :(得分:1)
像实数这样的模板类应该适合你。因为你可以重载所需的函数,如果需要,可以使用模板特化。
为了提高效率,使用STL算法而不是手写循环。
祝你好运答案 3 :(得分:1)
两种替代方案在封装方面都是等价的:程序中只有一个点你必须更改数字类型,这一个更改将影响整个程序。如果提供这两种选择,请选择typedef;它不那么优雅(=>更简单,更简单更好)并具有相同的力量。
当你对C ++更加熟悉时,模拟你的函数会更合适,因为数字类型的确定可以在本地而不是全局进行。使用模板,您可以确定实例化点(很可能是调用站点)的数字类型,从而提供更大的灵活性。但是,模板中存在许多缺陷,我建议您首先使用C ++获得更多经验,然后开始模板化。