[C++] Вопрос по шаблонам

nomad

Есть такой шаблон функции для вычисления целых степеней чисел:

template <int n>
double ipow(double a) {
return ipow<n/2>(a)*ipow<n/2>(a)*ipow<n%2>(a);
}

template <>
double ipow<1>(double a) {
return a;
}

template <>
double ipow<0>(double a) {
return 1;
}

template <>
double ipow<-1>(double a) {
return 1.0/a;
}

Все работает как и должно, в том числе и для отрицательных n.
Но это все-таки изобретение велосипеда. Нет ли какого-нибудь
более или менее "стандартного" решения для всякой
compile-time арифметики? В boost::mpl вроде бы есть только
базовые операции (сложение, умножение и т.д. а хотелось
бы что-то вроде факториалов, биномиальных коэффициентов и
того, что приведено на листинге в этом посте.
А?

pav7

табличко

deniska



Все работает как и должно, в том числе и для отрицательных n.
У тебя, конечно, работает, но по моему не так, как ты хочешь. Ты этим способом не сократил количество умножений.
 
Насчет "стандартных решений" - я не в курсе. Но несколько простых написать сам могу. Всякие биномиальные коэффициенты и факториалы можно и полностью сделать готовыми в compile-time, если очень надо. Факториалы, например, можно посчитать так
 
template <unsigned int N>
class CFact {
public:
enum {
result = N*CFact<N-1>::result
};
};
template <>
class CFact<0> {
public:
enum {
result = 1
};
};

deniska

Лучше основную функцию написать так:

template <int n>
double ipow(double a) {
double x = ipow<n/2>(a);
return x*x*ipow<n%2>(a);
}
Оставить комментарий
Имя или ник:
Комментарий: