Gegeben ein Template-Metaprogramm (TMP), erstellen C++ - Compiler Build-Statistiken, die die Anzahl der instanziierten Klassen zählen? Oder gibt es eine andere Möglichkeit, diese Nummer automatisch zu erhalten? So für z.B. die obiquitous faktoriellesAutomatisch die Anzahl der instanziierten Klassen in einem TMP zählen?
#include <iostream>
template<int N> struct fact { enum { value = N * fact<N-1>::value }; };
template<> struct fact<1> { enum { value = 1 }; };
int main()
{
const int x = fact<3>::value;
std::cout << x << "\n";
return 0;
}
Ich möchte die Nummer 3 (seit Tatsache < 3>, Tatsache < 2>, und Tatsache < 1> instanziiert) kommen. Dieses Beispiel ist natürlich trivial, aber wann immer Sie anfangen, z.B. Boost.MPL, Kompilierzeiten explodieren wirklich, und ich würde gerne wissen, wie viel davon wegen versteckter Klasseninstanziierungen ist. Meine Frage ist in erster Linie für Visual C++, aber Antworten für gcc würde auch geschätzt werden.
EDIT: kompiliert mein aktueller sehr spröde Ansatz für Visual C++ ist das Hinzufügen des Kompilierung Wechsels von einem von Stephan T. Lavavej videos/d1reportAllClassLayout und ein grep + Wort auf der Ausgabedatei zählen zu tun, aber es (a) erhöht mal enorm und (b) die Regex ist schwer zu 100% richtig zu bekommen.
+1. Ich schlug vor, dass es ziemlich einfach sein sollte, jeden Open-Source-Compiler zu hacken, aber Sie haben es tatsächlich auf bestmögliche Weise bewiesen (indem Sie einen Patch geschrieben haben, der es tatsächlich tut). – abarnert
Danke! Was wäre noch bequemer zu haben (ja, Scope Creep kommt!) Ist ein Protokoll aller Klassenvorlagen und die Anzahl ihrer Instanziierungen, anstatt nur die Gesamtzahl oder die gesamte Liste aller Instanziierungen. Vielleicht ist ein Perl-Skript, um das vollständige Build-Protokoll nachzubearbeiten, was ich versuchen sollte. – TemplateRex
einfach die Ausgabe nach 'awk -F '<' '{Vorlagen [$ 1] ++} END {für (t in Vorlagen) print t, Vorlagen [t]}'' –