我很好奇,为什么std::sqrt
和std::pow
只对单一类型的参数重载?为什么它们不作为函数/函子模板实现?
对于float
,double
和long double
类型是重载的。
没有其他浮点类型,因此使用模板的更通用的解决方案没有任何优势。
c++的<cmath>
头几乎是C的<math.h>
头的副本,但不完全是。
C没有重载,所以它提供了三种不同的平方根函数:
float sqrtf(float arg);
double sqrt(double arg);
long double sqrtl(long double arg);
,其他浮点函数也是如此。
c++的<cmath>
为所有三种浮点类型提供了sqrt
的和重载版本。
这里有一个例子来说明这一点:
#include <iostream>
#include <iomanip>
#include <cmath>
int main() {
auto f = std::sqrt(2.0F);
auto d = std::sqrt(2.0);
auto ld = std::sqrt(2.0L);
std::cout << std::setprecision(64);
std::cout << ' ' << sizeof f << ' ' << f << 'n';
std::cout << ' ' << sizeof d << ' ' << d << 'n';
std::cout << sizeof ld << ' ' << ld << 'n';
}
我的系统上的输出,演示了每次调用的不同大小和精度:
4 1.41421353816986083984375
8 1.4142135623730951454746218587388284504413604736328125
16 1.4142135623730950487637880730318329369765706360340118408203125
<cmath>
中的'c'字面意思是它是c库函数的集合。通过类比,<stdio.h>
可以包含在c++中作为<cstdio>
等,由于C没有模板,那么<cmath>
也没有任何内容。
除此之外,参数化类型会给您带来什么?这些函数接受并返回double
s,如果需要的话,您总是可以将其转换为普通的int
或float
。
我更正第二点:正如M.A.和弗朗索瓦·安德烈所指出的,在某些情况下,这是有用的。然而,我相信就<cmath>
而言,答案仍然成立。