Berechnung und drucken der Fakultät zur compile-Zeit C++
template<unsigned int n>
struct Factorial {
enum { value = n * Factorial<n-1>::value};
};
template<>
struct Factorial<0> {
enum {value = 1};
};
int main() {
std::cout << Factorial<5>::value;
std::cout << Factorial<10>::value;
}
obige Programm berechnet die Fakultät-Wert während der Kompilierung. Ich will print factorial Wert zur Kompilierzeit statt zur Laufzeit mithilfe von cout. Wie können wir erreichen drucken die Fakultät Wert zur compile-Zeit?
Ich bin mit VS2009.
Dank!
- Warum einfache Dinge kompliziert? Wenn Sie müssen nur Ihre Fakultät berechnet, verfassen eine übliche Programm (ohne TMP), kompilieren und ausführen.
- ich Lerne die Grundlagen von TMP und möchte wissen, wie das Ergebnis zu kompilieren, um sicherzustellen, dass die Logik korrekt ist
- TMP ist im Grunde eine Art von computing-Konstanten, die zur compile-Zeit. In welcher form würden Sie erwarten, dass die Ausgabe erfolgen? Im Präprozessor-es ist noch zu früh (die Konstanten werden berechnet, später), mit der "üblichen" compilation Schritt können Sie die Ausgabe nur mit
cout
und das wie (die erfordern, um das Programm auszuführen). - Was ist VS2009?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Fakultät gedruckt werden kann in der compiler-generierte Nachricht als:
Fehlermeldung:
Hier
3628800
Fakt ist der10
.Sehen es bei ideone : http://ideone.com/094SJz
So sind Sie auf der Suche nach diesem?
EDIT:
Matthieu fragte nach einem trick, um beides zu drucken, die Fakultät UND lassen die Zusammenstellung weiter. Hier ist ein Versuch. Es gibt keine Fehler, daher ist die compilation erfolgreich, mit einer Warnung.
Es kompiliert wird, mit dieser Warnung:
Hier
120
Fakt ist der5
.Demo bei ideone : http://coliru.stacked-crooked.com/a/c4d703a670060545
Sie konnte nur schreiben, ein schönes makro, und es stattdessen so:
Dass sieht toll aus.
_
und__
).__
und nicht Problem die Fehlermeldung, die Sie daran interessiert sind, so ist es nicht anwenden, da dieser aber nur demo-code, ich würde Stimmen, um es zu erhalten, wie es ist, lassen diejenigen, die es wünschen, verändern sich Ihre eigene Kopie._
könnte in der Tat verwendet werden, um drucken zu keinem Ergebnis... solange es positiv ist, um sicherzustellen, dass es läuft 🙂_
und__
wirklich versaut die Lesbarkeit des CodesIn diesem Fall, was Sie wirklich wollen, ist eine statische Aussage:
Wenn Ihr compiler nicht unterstützt
static_assert
noch, können SieBOOST_STATIC_ASSERT
.Ich bin sicher, es ist viel zu spät, aber trotzdem.
Es ist definitiv keine standard-Weg. Ich kann nicht glauben, eine compiler-spezifische Weise entweder.
[[Filler]]
#pragma message
oder#warning
ich denken kann, würde in der Regel drucken die Linie, nicht das Ergebnis der Auszählung :/