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 :

Metaprogrammation et generation de code


Sujet :

C++

  1. #1
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut Metaprogrammation et generation de code
    Bonjour � tous.
    je poss�de une super classe A dont d�rive les classes B, C et D.
    Je souhaite qu'une fonction de la classe Info m'affiche connu si l'objet qu'on lui passe est du type A ou d�riv� de A ou sinon inconnu.
    Pour cela j'utilise donc la m�taprogrammation en m'inspirant de cette page de wikipedia .
    Voici 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <iostream>
     
    class A{};
    class B : public A{};
    class C : public A{};
    class D : public A{};
     
    template <class H, class SousListe> struct ListeType {};
    struct ListeFin {};
     
    template <class T> class Node;
     
    // Spécialisation pour le type de fin de liste
    // C'est la super-classe
    template <> class Node< ListeFin > 
    {
    public:
     
        template <class Z> void getPath(const Z& z)
        {
                 std::cout << " inconnu" << std::endl;
        }
    };
     
    template <class H,class SousListe> class Node< ListeType<H, SousListe> > : public Node<SousListe>
    {
    public:
            template <> void getPath(const H& h){             
            std::cout << "connu" << std::endl;
                 }
    };
     
    /*
    template <class H,class SousListe> template <> void Node< ListeType<H, SousListe> >::getPath(const H& h)
        {
                 std::cout << " connu" << std::endl;
        }
    */
    typedef ListeType<A, ListeType<B, ListeType<C, ListeType<D, ListeFin> > > > UneListeClasses;
     
    int main()
    {
            int i;
    	A a;
    	Node<UneListeClasses> node;
            node.getPath(a);
     
    	B b;
    	node.getPath(b);
     
    	C c;
    	node.getPath(c);
     
    	return 0;
    }
    Avec ce code, j'obtient l'erreur
    explicit specialization in non-namespace ‘class Node<ListeType<H, SousListe> >’ scope.
    D'apres mes recherches, je n'ai pas le droit de specialiser dans la classe.
    Je comment donc la fonction dans la classe et je cr�er ce qui est comment� dans le code.

    Mais ca ne compile pas, l'erreur est:
    essaimetaprog.cpp:35: error: invalid explicit specialization before ‘>’ token
    essaimetaprog.cpp:35: error: enclosing class templates are not explicitly specialized
    essaimetaprog.cpp:35: error: no member function ‘getPath’ declared in ‘Node<ListeType<H, SousListe> >’
    Une id�e ?

    Merci.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  2. #2
    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
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename T>
    typename enable_if<is_base_of_<A, T>, void>::type f(T t)
    {
        std::cout << "type dérivé de A" << std::endl;
    }
     
    template<typename T>
    typename disable_if<is_base_of_<A, T>, void>::type f(T t)
    {
        std::cout << "type non dérivé de A" << std::endl;
    }

  3. #3
    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 effet, il faut utiliser Boost.TypeTraits (combin� � Boost.MPL), cf mon article sur les classes de traits

  4. #4
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Ca me permet de d�terminer si un objet de type A ou d�river mais je dois encore le passer � la bonne fonction apr�s.
    Or vace ce syst�me, je souhaite que le passage soit automatique.

    PS: prenez aussi ce code comme �tant un exo sur la m�taprog.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre exp�riment�
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 190
    Par d�faut
    Salut,

    Voil� ce que je propose pour que ton id�e puisse fonctionner :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <iostream>
    #include <typeinfo>
     
    class A{};
    class B : public A{};
    class C : public A{};
    class D : public A{};
     
    template<class H, class SousListe> struct ListeType{};
    struct ListeFin{};
     
    template<class T> class Node;
     
    // Spécialisation pour le type de fin de liste
    // C'est la super-classe
    template <>
    class Node<ListeFin> 
    {
    public:
    	template<class Z>
    	void getPath(const Z& z)
    	{
    		std::cout << "inconnu" << std::endl;
    	}
    };
     
    template <class H,class SousListe>
    class Node<ListeType<H, SousListe> > : public Node<SousListe>
    {
    public:
    	using Node<SousListe>::getPath; //sinon le getPath de Node<SousListe> est masqué par le getPath défini en-dessous
     
    	void getPath(const H& h)
    	{   
    		std::cout << typeid(H).name() << std::endl; //ça c'est juste pour savoir quelle fonction est appelée
    		std::cout << "connu" << std::endl;
    	}
    };
     
    typedef ListeType<A, ListeType<B, ListeType<C, ListeType<D, ListeFin> > > > UneListeClasses;
     
    int main()
    {
    	A a;
    	Node<UneListeClasses> node;
    	node.getPath(a);
     
    	B b;
    	node.getPath(b);
     
    	C c;
    	node.getPath(c);
     
    	D d;
    	node.getPath(d);
     
    	int i;
    	node.getPath(i);
     
    	return 0;
    }

  6. #6
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Hum, je n'avais pas envisag� ca comme ca mais ca marche.
    Merci.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    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
    Avec SFINAE c'est automatique aussi...

  8. #8
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    loufoque >> Tu peux d�velopper ?
    Je connais seulement SFINAE de nom.

    Merci.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    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
    Ben SFINAE c'est ce que j'ai utilis� plus haut

  10. #10
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Merci loufoque.
    En googlant j'ai compris.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Recuperation variable et generation de code
    Par newixz dans le forum Delphi
    R�ponses: 13
    Dernier message: 27/12/2006, 13h31
  2. Generation de code a partir de SQL
    Par RemiRoques dans le forum G�n�ral Java
    R�ponses: 10
    Dernier message: 09/06/2006, 16h07
  3. Problème de génération du code java...
    Par nikalkal dans le forum Rational
    R�ponses: 1
    Dernier message: 21/04/2006, 14h32
  4. Quel avenir pour les outils de génération de code ?
    Par Bruno75 dans le forum D�bats sur le d�veloppement - Le Best Of
    R�ponses: 5
    Dernier message: 05/11/2003, 18h30
  5. Génération de code
    Par YAMKI dans le forum Rational
    R�ponses: 5
    Dernier message: 22/04/2003, 16h41

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