Das ist lustig!
-
Wie kommt ihr eigentlich darauf, dass das 'ne Quersumme ist? Das ist eine Summation der ersten N natürlichen Zahlen, also eine umständliche Berechnung von N(N+1)/2.
-
und ich dachte die quersumme von 10 wäre 1

-
Und hier noch ein kleines Beispiel
Als Template Metaprogramm welches zur Zeit des Compilierens berechnet wird:
#include <iostream> template< unsigned N > struct binary { static unsigned const value = binary<N/10>::value * 2 + N % 10; }; template<> struct binary<0> { static unsigned const value = 0; }; int main() { std::cout << binary<101010>::value << std::endl; }Und einmal das ganze zur Laufzeit im vergleich dazu:
#include <iostream> unsigned binary( unsigned N ) { return N == 0 ? 0 : N % 10 + binary(N/10) * 2; } int main() { std::cout << binary(101010) << std::endl; }Das Beispiel ist aus dem Buch:
C++ Template Metaprogramming | ISBN: 0321227255BR
evilissimo
-
Walli schrieb:
Wie kommt ihr eigentlich darauf, dass das 'ne Quersumme ist? Das ist eine Summation der ersten N natürlichen Zahlen, also eine umständliche Berechnung von N(N+1)/2.
stimmt.
ich habs verpeilt. hab mich mit der bezeichnung quersumme darauf verlassen das es richtig ist 
Ändert aber nix an der funktionsweise.
-
evilissimo schrieb:
template< int N > struct cross_sum { static int const value = cross_sum<N-1>::value + N; }; template<> struct cross_sum<0> { static int const value = 0; };da sollte man besser unsigned nehmen.
cross_summe<-1> ist sonst problematisch
-
Eigentlich meinte ich dass es lustig ist das zu compilieren. Die verschiedenen Compiler reagieren da sehr toll

-
evilissimo schrieb:
Vertexwahn schrieb:
das ist ein Quersummen Hack - Spitzenklasse 
@Moderator: bitte löschen
Eigentlich sehe ich auch keinen Grund warum das gelöscht werden sollte. Und als Hack muss man das auch nicht bezeichnen ausser das man anstatt dem enum vielleicht ein static int const v nehmen würde.
was ist der vorteil gegenüber enum? ich nehm für sowas bisher auch immer enums...

-
@Das ist lustig: Das könnte daran liegen, dass das Template keine Abbruchbedingung spezialisiert.
@rapso: erstens sind enums nicht für diesen Einsatz gedacht (ich weiß, schwaches Argument), zweitens schränken sie die möglichen Werte eines Metaalgorithmus' unnötig ein (z.B. kann enum iirc nicht negativ sein). Es gab noch einen besseren und einleuchtenderen Grund, der ist mir aber wohl entfallen.
BTW, Quersumme sieht als Metaprogramm so aus, wer den subtilen Unterschied findet und begreift darf sich freuen, dass er die Grundlagen der Numerik beherrscht
:template <int zahl> struct quersumme { static const unsigned value = zahl % 10 + quersumme<zahl / 10>::value; }; template <> struct quersumme<0> { static const unsigned value = 0; };
-
.filmor schrieb:
@Das ist lustig: Das könnte daran liegen, dass das Template keine Abbruchbedingung spezialisiert.
@rapso: erstens sind enums nicht für diesen Einsatz gedacht (ich weiß, schwaches Argument), zweitens schränken sie die möglichen Werte eines Metaalgorithmus' unnötig ein (z.B. kann enum iirc nicht negativ sein). Es gab noch einen besseren und einleuchtenderen Grund, der ist mir aber wohl entfallen.
BTW, Quersumme sieht als Metaprogramm so aus, wer den subtilen Unterschied findet und begreift darf sich freuen, dass er die Grundlagen der Numerik beherrscht
:template <int zahl> struct quersumme { static const unsigned value = zahl % 10 + quersumme<zahl / 10>::value; }; template <> struct quersumme { static const unsigned value = 0; };deine Spezialisierung ist fehlerhaft
enums können alle integralen Typen sein
enum heinz { fail=-1 };das Problem an enums ist das so viel implementationsspezifisch ist.
das der Type eigentlich vom Ergebnis abhängt wird es mal grösser als int kann es unsigned int werden usw.
-
Korrigiert und zu Kenntnis genommen

-
.filmor schrieb:
@rapso: erstens sind enums nicht für diesen Einsatz gedacht (ich weiß, schwaches Argument)
als ich das gelernt hatte, hat man genau das gegenteil gesagt, anonyme enums wären perfekt dafür gedacht, weil es keine datentypbindung hat, sondern für eine cpu optimal übersetzt werden kann.
[qoute]
, zweitens schränken sie die möglichen Werte eines Metaalgorithmus' unnötig ein(z.B. kann enum iirc nicht negativ sein)[/quote]
gerade durch negative zahlen ist der algo fehleranfällig
Es gab noch einen besseren und einleuchtenderen Grund, der ist mir aber wohl entfallen.
genau danach hatte ich ja gequängelt
