Dato un metaprogramma modello (TMP), i compilatori C++ producono statistiche di compilazione che contano il numero di classi istanziate? O c'è un altro modo per ottenere automaticamente questo numero? Quindi per es. il obiquitous fattorialeConta automaticamente il numero di classi istanziate in un TMP?
#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;
}
Vorrei tornare al numero 3 (dal fatto < 3>, infatti < 2>, e infatti < 1> vengono istanziati). Questo esempio è ovviamente banale, ma ogni volta che inizi a utilizzare per es. Boost.MPL, i tempi di compilazione esplodono davvero, e mi piacerebbe sapere quanto sia dovuto a istanze di classe nascoste. La mia domanda è principalmente per Visual C++, ma anche le risposte per gcc sarebbero apprezzate.
EDIT: il mio attuale approccio molto fragile per Visual C++ sta aggiungendo lo switch di compilazione di uno dei di Stephan T. Lavavej videos/d1reportAllClassLayout e facendo un conteggio di grep + parola sulla file di output, ma (a) aumenti di compilazione tempi enormi e (b) la regex è difficile da ottenere corretta al 100%.
+1. Ho suggerito che dovrebbe essere abbastanza facile hackerare qualsiasi compilatore open source, ma in realtà lo hai dimostrato, nel miglior modo possibile (scrivendo una patch che effettivamente lo fa). – abarnert
Grazie! Ciò che sarebbe anche più conveniente avere (sì, scope creep in arrivo!) È un log di tutti i modelli di classe e il numero delle loro istanziazioni, piuttosto che solo il numero totale o l'intero elenco di tutte le istanze. Forse uno script perl per post-processare il log di compilazione completo è quello che dovrei provare. – TemplateRex
invia l'output a 'awk -F '<' '{templates [$ 1] ++} END {per (t nei modelli) print t, templates [t]}'' –