4

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>,具有更自然的界面。

我错过了什么(可能除了一些以前提出的问题)?

4

1 回答 1

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);

我不太清楚为什么你想要一个函数模板而不是重载。对于大多数数学函数,没有通用实现是可能的;正确的实现将取决于每种类型的精度、舍入规则等。因此,替代方案将是一个没有通用实现和三个专业化的模板函数。与“更简单”的重载功能相比,这能为您带来什么?

于 2013-02-01T10:41:53.857 回答