2009-03-03 3 views
4

Alot Templat-Code wie folgt aussieht:Nameless Aufzählungen in Vorlagen

template <typename T> 
class foo 
{ 
    enum { value = <some expr with T> }; 
}; 

Ein Beispiel kann here im Prime Prüfprogramm zu sehen und ich habe es in einer Factorial Implementierung einmal zu sehen.

Meine Frage ist, warum eine namenlose enum verwenden? Gibt es einen besonderen Grund dafür? Ein statischer const int könnte zum Beispiel auch funktionieren?

edit:

@ Benoît: Danke für den Link, sofern es die Einsicht, die ich suchte!

Antwort

8

Eine statische const-Variable würde Speicher verbrauchen (wie Sean sagte), während enums keinen Speicher belegen. Sie existieren nur in der Welt des Compilers. Zur Laufzeit sind sie nur normale Ganzzahlen.

Ansonsten würde es funktionieren, außer für die schlechte Implementierung des Standards durch den Compiler.

Es ist eine gründliche thread zum Thema im Boost-Mailing-Liste:

+0

@underscore_d kannst du mir irgendein Beispiel geben, das untersuchen kann, wie enum und const unterschiedlich groß sind? – UnKnown

+0

Ich hätte gesagt, 'const [expr]' Mitglieder würden 'sizeof (Obj)' erhöhen, speziell "statische", aber im Rückblick denke ich, dass ich ein Idiot bin. Ich hätte sagen sollen ''statische const [expr]' - Variablen werden wahrscheinlich Platz im ausführbaren Image und möglicherweise RAM' zugewiesen, aber nicht pro Instanz - aus einem offensichtlichen Grund: sie sind statisch. Jetzt bin ich unterwegs, um zu testen, ob triviale 'statische const [expr]' -Konstanten vom Compiler inline geschrieben werden, wie 'Enum's. –

3

Wenn ich mich richtig erinnere, würde ein statisches const erfordern, dass Sie Platz zuweisen, indem Sie die Variable deklarieren und definieren, während ein unbenanntes enum das nicht tut.

+0

Sean können Sie Ihre Antwort mit einem Beispiel erforschen bitte? – UnKnown