Sie müssen eine Spezialisierung der Template-Funktion definieren, um die Rekursion bei der Kompilierzeit und nicht bei runtime zu stoppen, genau wie bei Ihrer struct-Version.
%Vor% Ich habe versucht, die faktorielle Implementierung mit constexpr
-Funktion neu zu schreiben, aber aus irgendeinem Grund habe ich keine Ahnung, warum ich einen Kompilierungsfehler bekomme:
Die rekursive Vorlageninstanziierung überschritt die maximale Tiefe von 256
Eigentlich weiß ich, was die Fehlermeldung bedeutet, aber was ich nicht bin, warum bekomme ich diesen Fehler und warum der Code 1 mit struct
arbeitet, aber die zweite mit Funktion nicht. Was ist der Unterschied zwischen ihnen?
Sie benötigen einen Stoppzustand wie den folgenden:
%Vor% da f2<N - 1>()
instanziiert werden muss, haben Sie in diesem Fall Ihren stop-Zustand:
Aber wenn Sie constexpr
verwenden, brauchen Sie nicht wirklich Vorlagen zu verwenden, da der ganze Punkt darin besteht, dass es zur Kompilierzeit gemacht wird, also drehen Sie es in folgendes:
Wenn N == 0
ist, muss der Compiler f2<-1>
noch instanziieren, weil der Funktionsaufruf im Code vorhanden ist. Wenn f<-1>
instanziiert wird, wird f<-2>
instanziiert und so weiter. Wenn Sie diese Anweisung immer wieder anwenden, wird der Compiler die Vorlage erneut durchlaufen, bis sie die maximale Tiefe überschreitet.
Sie müssen eine Spezialisierung der Template-Funktion definieren, um die Rekursion bei der Kompilierzeit und nicht bei runtime zu stoppen, genau wie bei Ihrer struct-Version.
%Vor%Ich habe versucht, die faktorielle Implementierung mit %code% -Funktion neu zu schreiben, aber aus irgendeinem Grund habe ich keine Ahnung, warum ich einen Kompilierungsfehler bekomme:
Die rekursive Vorlageninstanziierung überschritt die maximale Tiefe von 256
Eigentlich weiß ich, was die Fehlermeldung bedeutet, aber was ich nicht bin, warum bekomme ich diesen Fehler und warum der Code 1 mit %code% arbeitet, aber die zweite mit Funktion nicht. Was ist der Unterschied zwischen ihnen?
%Vor%Sie benötigen einen Stoppzustand wie den folgenden:
%Vor%da %code% instanziiert werden muss, haben Sie in diesem Fall Ihren stop-Zustand:
%Vor%Aber wenn Sie %code% verwenden, brauchen Sie nicht wirklich Vorlagen zu verwenden, da der ganze Punkt darin besteht, dass es zur Kompilierzeit gemacht wird, also drehen Sie es in folgendes:
%Vor%Wenn %code% ist, muss der Compiler %code% noch instanziieren, weil der Funktionsaufruf im Code vorhanden ist. Wenn %code% instanziiert wird, wird %code% instanziiert und so weiter. Wenn Sie diese Anweisung immer wieder anwenden, wird der Compiler die Vorlage erneut durchlaufen, bis sie die maximale Tiefe überschreitet.