Здравствуйте, Юрий Жмеренецкий, Вы писали:
>> Но большинство рекурсивных функций на шаблонах не страдают простотой и изяществом (хотя это субъективно).
Вот пример кода вычисляющего простые числа а не факториал.
template<int>struct prime;//Вычисление N-го простого числа prime<N>::result
template<int>struct is_prime;//Проверка числа на простоту is_prime<N>::result
template<>struct prime<0>{enum{result=2};};//Число 2 нулевое простое число
template<>struct prime<1>{enum{result=3};};//Число 3 первое простое число
template<>struct prime<2>{enum{result=5};};//Число 5 второе простое число
template<>struct is_prime<0>{};//Число 0 не простое и не составное
template<>struct is_prime<1>{};//Число 1 не простое и не составное
template<>struct is_prime<2>{enum{result=true};};//Число 2 простое
template<>struct is_prime<3>{enum{result=true};};//Число 3 простое
template<int n>
struct is_prime{
template<int k>
struct helper{//Вспомогательная структура преобразующая цикл в рекурсию.
enum{
tmp=prime<k>::result,
result=helper<(n<tmp*tmp)?0:(n%tmp?k+1:1)>::result
};
};
template<>struct helper<0>{enum{result=true};};//Выход из цикла - число простое
template<>struct helper<1>{enum{result=false};};//Выход из цикла - число составное
enum{
tmp=n%6,//Все простые числа большие трёх имеют вид 6*N+1 или 6*N+5
result=helper<((tmp==1)||(tmp==5))+1>::result//Проверим делится ли n на 5 7 11 13 19 23...
};
};
template<int n,bool>//Вспомогательная структура преобразующая цикл в рекурсию.
struct helper{enum{result=helper<n+2,is_prime<n+2>::result>::result};};
template<int n>
struct helper<n,true>{enum{result=n};};
template<int idx>//Возьмём N-1 простое число и будем прибалять двойку пока не получим новое простое число
struct prime{enum{result=helper<prime<idx-1>::result,false>::result};};
Я не ставил целью уменьшать размер кода но
аналогичный код реалтайма лишь немного короче.
Было бы интересно посмотреть реализацию с использованием Вашей библиотеки.