Quando si esegue la metaprogrammazione con i modelli C++, esiste un metodo che può essere utilizzato, un po 'come un debugger, per esaminare il modo in cui i modelli vengono istanziati e rispettati? Sembra proprio ora che, quando si crea una complicata rete di modelli, non ci sia davvero un ottimo modo per eseguire il debugging, se non guardando i messaggi di errore del compilatore per vedere come vengono istanziati i template (se ci sono errori del compilatore), e il tentativo di lavorare all'indietro dai messaggi di errore se viene generato qualcosa di inaspettato. Non sono sicuro se quello che sto cercando esista, come dovrebbe essere qualcosa che viene fatto in fase di compilazione, ma fondamentalmente sarebbe un metodo, un po 'come passare il codice ed esaminare lo stack frame in gdb
in fase di esecuzione, in cui è possibile arrestare il compilatore e esaminare l'ambiente per la sequenza mediante la quale viene creato un modello o un set di modelli nidificati.Debug delle istanze del modello
Per esempio, diciamo che ho creato un po 'di semplice codice come il seguente:
template<typename T, typename R = void>
struct int_return_type {};
template<typename R>
struct int_return_type<int, R>
{
typedef R type;
};
template<typename T, typename R = void>
struct float_return_type {};
template<typename R>
struct float_return_type<float, R>
{
typedef R type;
};
template<typename T>
typename int_return_type<T>::type test()
{
cout << "T type is int" << endl;
}
template<typename T>
typename float_return_type<T>::type test()
{
cout << "T type is float" << endl;
}
int main()
{
test<int>();
test<float>();
return 0;
}
So che questo è relativamente facile codice da seguire, ma i modelli possono ottenere un po' più coinvolti, soprattutto quando si fa metaprogrammazione, ricorsione, ecc. Capisco che il compilatore invierà messaggi di errore che possono essere utilizzati per dedurre come i modelli vengono istanziati, ma mi chiedo anche cosa può essere fatto quando il codice del template è corretto in senso sintattico, ma il tempo di esecuzione i risultati sono ancora errati. Sarebbe bello, per esempio, avere un metodo per fermare il compilatore e vedere cosa test
, come int_return_type
e float_return_type
, con cui veniva istanziato o quali istanze non funzionavano.
Sono le uniche opzioni disponibili al momento per il debug dei modelli con questo livello di granularità 1) i messaggi di errore del compilatore quando il codice non è corretto, e 2) una combinazione di disassemblatori e debugger per vedere quale codice istanziato è stato generato se l'esecuzione -tempo i risultati non sono corretti? O ci sono altre utility che aiutano a "guardare" come vengono istanziati i template, e vedere/ispezionare quale codice viene generato dal compilatore per investigare ed eseguire il debug degli errori del template?
diverso da 'static_assert' per fare cose che si desidera guardare in errori Non credo che ci sia nulla da aiutare – Flexo