为什么cmath不使用模板和/或重载

时间:2013-02-01 09:53:02

标签: c++ templates overloading tr1 cmath

TR1引入C ++ 11的许多新功能都有丑陋的类似C的签名。例如,引用Boost的TR1文档(http://www.boost.org/doc/libs/1_52_0/doc/html/boost_tr1/subject_list.html#boost_tr1.subject_list.special):

// [5.2.1.1] associated Laguerre polynomials:
double assoc_laguerre(unsigned n, unsigned m, double x);
float assoc_laguerref(unsigned n, unsigned m, float x);
long double assoc_laguerrel(unsigned n, unsigned m, long double x);

显然,人们更喜欢一些模板化实现(实际上是Boost中这些函数的“本机”签名),或者至少有一些重载而不是几个标识符。

我可以理解,针对C兼容性意味着支持这些标识符,但这对纯C ++扬声器来说是一个麻烦。除<cmath>之外,还可能有一些<math>,具有更自然的界面。

我缺少的是什么(此外,可能还有一些先前提出的问题)?

1 个答案:

答案 0 :(得分:4)

我不知道Boost,但是所有标准函数都在 <cmath>有三种标准类型的重载,所以你 有例如:

double cos(double);
float cos(float);
long double cos(long double);

代替C:

double cos(double);
float cosf(float);
long double cosl(long double);

我不太清楚为什么你想要一个功能模板而不是 重载。对于大多数数学函数,没有通用 实施是可能的;正确的实施将取决于 精度,舍入规则等,每个都不同 类型。所以替代方案是没有模板功能 通用实现和三个专业化。什么 是否会因为“更简单”的重载功能而购买?