Re: Compile-time template library
От: Dmi_3 Россия  
Дата: 24.10.05 21:57
Оценка: 1 (1) +1 :)
Здравствуйте, Юрий Жмеренецкий, Вы писали:

>> Но большинство рекурсивных функций на шаблонах не страдают простотой и изяществом (хотя это субъективно).


Вот пример кода вычисляющего простые числа а не факториал.

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};};


Я не ставил целью уменьшать размер кода но
аналогичный код реалтайма лишь немного короче.
Было бы интересно посмотреть реализацию с использованием Вашей библиотеки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.