Здравствуйте, achmed, Вы писали:
A>Как лучше сделать сабж ?
Посмотрите пример пионера метапрограммирования о
пузырьковой сортировке.
Здравствуйте, achmed, Вы писали:
A>Как лучше сделать сабж ?
Например
template<int count>
class Fact
{
public:
enum { val = count * Fact<count-1>::val };
};
template<>
class Fact<0>
{
public:
enum { val = 1 };
};
int main()
{
std::cout << Fact<3>::val << std::endl;
}
Здравствуйте, s_anatoli, Вы писали:
_>Посмотрите пример пионера метапрограммирования о пузырьковой сортировке.
Беда в том, что у компиляторов есть некая предельная глубина рекурсии в шаблонах. Поэтому выполнение цикла
template<int N> struct sum
{
enum { value = sum<N-1>::value + N };
};
template<> struct sum<0>
{
enum { value = 0 };
};
где-то для N=32 даст ошибку.
Так что, длинные циклы требуется разбивать, чтобы глубина рекурсии была, скажем, логарифмической
template<int N, int L> struct sum2
{
enum { value = sum2<N,L/2>::value + sum2<N+L/2,L-L/2>::value };
};
template<int N> struct sum2<N,0>
{
enum { value = 0 };
};
template<int N> struct sum2<N,1>
{
enum { value = N };
};
template<int N> struct sum
{
enum { value = sum<1,N>::value };
};
Здравствуйте, Кодт, Вы писали:
К>Беда в том, что у компиляторов есть некая предельная глубина рекурсии в шаблонах. Поэтому выполнение цикла...
Для большей точности следует отметить, что использование термина "цикл" в данном контексте не совсем корректно, так как С++ не предоставляет средств, позволяющих реализовать итеративный (
не рекурсивный) вариант того или иного алгоритма на этапе компиляции. Цикл и рекурсия — разные понятия, несмотря на то, что во многих случаях могут заменять друг друга (но только не на этапе компиляции программы).
... << RSDN@Home 1.1.3 stable >>