2010-03-20 4 views
6

Existe-t-il un moyen de vérifier étape par étape ce qui se passe dans un modèle? Je veux dire comment il est instancié étape par étape et ainsi de suite?Métaprogrammes de débogage

Dans le livre, je l'ai mentionné here,

je trouve (il y a 2 minutes) par exemple tout à fait intéressant de la façon dont pourrait être mis en œuvre binaire comme métafonction.

template <unsigned long N> 
    struct binary 
    { 
     static unsigned const value 
      = binary<N/10>::value << 1 // prepend higher bits 
      | N%10;     // to lowest bit 
    }; 

    template <>       // specialization 
    struct binary<0>      // terminates recursion 
    { 
     static unsigned const value = 0; 
    }; 

et je pense qu'il pourrait être très utile pour être en mesure de voir étape par étape ce qui a été fait lors de l'instanciation de ce modèle. Merci pour vos réponses.

+0

Ne pas accepter cela rapidement, peut-être quelqu'un d'autre a un meilleur conseil :) –

Répondre

0

Le meilleur que j'ai vu jusqu'ici était le document de recherche sur Templight, mais je ne suis pas au courant d'une mise en œuvre publicisée.

Vous pouvez cependant vous aider beaucoup en utilisant des assertions statiques descriptives (c'est-à-dire en temps de compilation) - voir par ex. Augmente static assert ou MPLs asserts. Dans certains cas, il peut être utile de provoquer une erreur de compilation (par exemple en utilisant des assertions statiques) pour obtenir une trace d'instanciation de modèle à partir du compilateur.
En outre, rien ne vous empêche de générer une sortie de résultats de méta-fonctions pour les tests.

+0

Oui, je pense que la sortie d'exécution me conviendra bien. Merci –

+0

Après avoir dit que maintenant j'ai rencontré un problème avec la sortie. J'ai essayé quelque chose comme ça: cout << N; mais j'ai des erreurs. Aidez-moi. –

+1

Vous ne pouvez pas simplement lancer des instructions de sortie dans des méta-fonctions, mais vous pouvez générer des valeurs à partir d'instanciations concrètes de méta-fonctions, par ex. 'std :: cout << binary<101> :: value'. –