Q: How come cmath does not use templates and/or overloads Many of the new functions brought in C++11 by TR1 have ugly C-like signatures.  For instance, quoting Boost's TR1's documentation (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);

Obviously one would have preferred some templated implementation (which is actually the "native" signature of these functions in Boost), or at least some overloading instead of several identifiers.
I can understand that aiming at C compatibility means supporting these identifiers, but then this a nuisance for pure C++ speakers.  In addition to <cmath>, there could be some <math>, with more natural interfaces.
What is it that I am missing (besides, possibly, some previously asked questions)?

A: I don't know about Boost, but all of the standard functions in
<cmath> have overloads for the three standard types, so you
have e.g.: 
double cos(double);
float cos(float);
long double cos(long double);

in place of C's:
double cos(double);
float cosf(float);
long double cosl(long double);

I'm not quite sure why you want a function template instead of
overloads.  For most mathematic functions, no generic
implementation is possible; a correct implementation will depend
on precision, rounding rules, etc. which are different for each
type.  So the alternative would be a template function without
a generic implementation, and three specializations.  And what
does that buy you over the "simpler" overloaded functions?
