IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Méta-programmation


Sujet :

C++

  1. #1
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut Méta-programmation
    Bonjour,

    Je voudrais savoir s'il est possible de trouver un moyen d'intégrer la fonction factorielle suivante dans une classe de manière à faire "plus propre" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    	class CMetaAlgebra
    	{
    	     private :
    		template<> static inline Real Factorial<0>()
    		{
    			return Real(1.0);
    		}
     
    	     public :
    		template<unsigned int I> static inline Real Factorial()
    		{
    			return I * Factorial<I - 1>();
    		}
    	};
    Merci d'avance pour votre aide


    Nico.

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Oui cela est possible! ^^
    (ps : la spécialisation d'une fonction/classe template doit se faire après la générale, non? si mes souvenir sont bons, c'est de plus en plus spécialisé lorsque l'on descend dans le code.)
    Sinon, qu'est-ce qui te pose problème? La manière la plus pratique, je trouve, pour la factorielle en méta-progr, est celle de Loulou dans son article :
    http://loulou.developpez.com/tutorie...metaprog/#L3.2

  3. #3
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Malheureusement ca ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    test2.cpp:7: erreur: invalid explicit specialization avant un élément lexical « > »
    test2.cpp:7: erreur: spécialisation explicite dans la portée d'un non espace de noms « class CMetaAlgebra »
    test2.cpp:7: erreur: expected init-declarator avant un élément lexical « < »
    test2.cpp:7: erreur: expected `;' avant un élément lexical « < »

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Tu peux montrer le code s'il te plait?

  5. #5
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include <iostream>
     
     
    class CMetaAlgebra
    {
         private :
    	template<> static inline double Factorial<0>()
    	{
    		return double(1.0);
    	}
     
     
         public :
    	template<unsigned int I> static inline double Factorial()
    	{
    		return I * Factorial<I - 1>();
    	}
    };
     
    int main( int argc, char ** argv )
    {
    	return EXIT_SUCCESS;
    }

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En inversant l'ordre des 2 ?

  7. #7
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Idem ca ne change rien, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test2.cpp:12: erreur: invalid explicit specialization avant un élément lexical « > »
    test2.cpp:12: erreur: spécialisation explicite dans la portée d'un non espace de noms « class CMetaAlgebra »
    test2.cpp:13: erreur: déclaration de membre de fonction invalide

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    La spécialisation se met après.

    Mais ... en quoi mettre ça dans une classe est plus propre ? (chose qui je pense est au coeur de ton problème)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    En fait je voudrai pouvoir mettre cette fonction factorielle dans une classe pour séparer les deux fonctions : le cas de base irait en partie privée et le cas récursif en partie publique. Cela éviterait que l'utilisateur appelle la fonction du cas de base.

    Sinon, pourrais-tu me montrer à quoi ressemblerait le morceau de code qui compile ? (d'après ce que j'ai pu lire sur sur le net, ca a l'air apparement impossible)

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Pourquoi séparer quoique ce soit? C'est la même fonction. De plus, en général j'ai plutôt vu l'encapsulation des cas récursifs et terminaux dans une fonction reponsable de l'appel.

    Quand à un code qui compile, celui de Loulou le devrait.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    pourrais-tu me montrer à quoi ressemblerait le morceau de code qui compile ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class Real
    {
    public:
    	double value;
     
    	Real(double a)  : value(a) { }
    	Real operator*(unsigned int a)
    	{
    		return Real(value * a);
    	}
    };
     
    class CMetaAlgebra
    {
    public:
    	template<unsigned int I> static inline Real Factorielle()
    	{
    		return Factorielle<I - 1>() * I;
    	}
    };
     
    template<> inline Real CMetaAlgebra::Factorielle<0>()
    {
    	return Real(1.0);
    }
    Les spécialisations doivent s'effectuer en dehors des classes.
    Il n'est pas possible d'avoir une spécialisation avec une visibilité différente du reste.

  12. #12
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Merci pour ton aide, c'est vraiment sympa

  13. #13
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    J'ai une dernière petite question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<> inline Real CMetaAlgebra::Factorielle<0>()
    {
       return Real(1.0); // <-- question sur ce bout de code
    }
    Est-il préférable de passer la valeur de retour au constructeur du type Real (en fait c'est un double ou un float dans mon application) et de l'indiquer au compilateur ? Est-il préférable d'indiquer au compilateur que le nombre retourné est un flottant par 1.0f (avec ou sans le constructeur Real) ? Dernière chose : qu'est-ce que cette dernière notation indique précisément au compilateur ? Merci


    Nico.

  14. #14
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Je viens de terminer la classe `CMetaAlgebra`. Elle fera partie d'une bibliothèque mathématique pour l'imagerie qui se nomme Mira. Elle est disponible sur mon site Internet sur la page d'accueil. Voilà

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je viens de voir que dans ton application Real est un typedef sur double.
    Donc tu peux retourner directement 1.0

  16. #16
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    1.0 ou 1.0f ?

  17. #17
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par nicolas66
    1.0 ou 1.0f ?
    1.0, le suffixe 'f' indique un float.

  18. #18
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Comment peut-on indiquer un double ?

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    1.0

  20. #20
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Merci à vous tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/01/2010, 10h47
  2. méta-programmation et chronomètre
    Par salseropom dans le forum C++
    Réponses: 12
    Dernier message: 09/08/2009, 04h24
  3. Boucle for en méta-programmation?
    Par Charlemagne dans le forum Langage
    Réponses: 10
    Dernier message: 27/04/2009, 16h48
  4. Méta-programmation en C#
    Par mister3957 dans le forum C#
    Réponses: 2
    Dernier message: 20/09/2008, 11h47
  5. Méta-Programmation - [ structures de données ]
    Par Dam)rpgheaven dans le forum C++
    Réponses: 3
    Dernier message: 03/12/2004, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo