007
03.05.2003, 11:56 Uhr
~0xdeadbeef
Gast
|
OK, hier nochmal was einfaches:
C++: |
#include <iostream>
template <bool b, int zahl, int i> class bq_loop { }; template <int zahl, int i> class bq_loop<false, zahl, i> { public: static const int bq_iter = (zahl&i ? 1 : 0) + bq_loop<(i>zahl), zahl, 2*i>::bq_iter; }; template <int zahl, int i> class bq_loop<true, zahl, i> { public: static const int bq_iter = 0; };
template <int i> class zahl { public: static const int binaer_quersumme = bq_loop<false, i, 1>::bq_iter; };
template <int i> class main_loop { public: static void body() { main_loop<i-1>::body(); std::cout << i << ":\t" << zahl<i>::binaer_quersumme << std::endl; } }; class main_loop<-1> { public: static void body() {} };
int main(int argc, char *argv[]) { main_loop<100>::body(); return 0; }
|
Das komische Konstrukt mit den bools muss sein, weil der Compiler konstante x ? y : z-Ausdrücke scheinbar strikt auswertet und dann kein Schleifenabbrucht gegeben wäre. Bei der Konstruktion des Standards hat wohl keiner damit gerechnet, das jemals jemand auf eine so kranke Idee wie template-metaprogramming kommen könnte |