Многие из новых функций, введенных в C ++ 11 TR1, имеют ужасные 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>
, с более естественными интерфейсами.
Что мне не хватает (кроме, возможно, некоторых ранее заданных вопросов)?
Я не знаю о 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);
Я не совсем уверен, почему вы хотите шаблон функции вместо
Перегрузки. Для большинства математических функций нет общего
реализация возможна; правильная реализация будет зависеть
на точность, правила округления и т. д., которые различны для каждого
тип. Таким образом, альтернативой будет функция шаблона без
общая реализация и три специализации. И что
это покупает вас по сравнению с «более простыми» перегруженными функциями?
Других решений пока нет …