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

标签 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 中这些函数的“ native ”签名),或者至少一些重载而不是几个标识符。

我可以理解,以 C 兼容性为目标意味着支持这些标识符,但这对纯 C++ 使用者来说是个麻烦。除了<cmath> , 可能有一些 <math> ,具有更自然的界面。

我遗漏了什么(除了,可能还有一些以前问过的问题)?

最佳答案

我不知道 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);

我不太清楚为什么你想要一个函数模板而不是 过载。对于大多数数学函数,没有泛型 实现是可能的;正确的实现将取决于 关于精度、舍入规则等,每个都不同 类型。所以替代方案是一个没有 一个通用的实现和三个特化。还有什么 这会让您放弃“更简单”的重载函数吗?

关于c++ - 为什么 cmath 不使用模板和/或重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643596/

相关文章:

c++ - 即使在销毁 boost::asio::ip::tcp::socket 后如何使用原始文件描述符?

c++ - 用于 C# 的托管 C++ 代码

xml - Magento 继承和重用模板变量

C++,实例化一个通用节点,使用模板存储一个对象的实例

c++ - 接受 STL_container_type<string>::iterator 的模板化参数

c++ - 下标运算符重载以访问私有(private)数组

c++ - 程序不读入节点并将其添加到 2 个双向链表 C++

java - 在使用 JNI 将 c++ unordered_map 返回到 java 之前将其转换为 java hashMap

c++ - C++中函数重载的混淆

c# - 方法重载和继承