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

Langage C++ Discussion :

mot clef Generic et Ref


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut mot clef Generic et Ref
    Voici un autre toy 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
     
     
    struct A{ 
    	int F (){ return 1; } 
    };
     
    template<bool ,class> struct enable_if{};
    template<class T> struct enable_if<true,T>{typedef T type;};
     
    template< class T,int n=3> 
    struct H{
    	template<int m>
    	int h () 
    	{
    		typedef typename enable_if< m<=n ,H>::type check_type;
    		T a; return a.F();
       }
    };
     
    int main()
    {
    	H<A > u_a;
    	int t = u_a.h<1>();
     	//t = u_a.h<6>();
    	return 0;
    }
    Grace a ce que vous m'avez appris je permet un erreur de compilation si m> n ( ligne en commentaire).
    Cependant si j essoie de rentrer la definition de enable à l interieur de la fonction h:

    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
     
    struct A{ 
    	int F (){ return 1; } 
    };
     
    template< class T,int n=3> 
    struct H{
    	template<int m>
    	int h () 
    	{
    		template<bool ,class> struct enable_if{};
    		template<class T> struct enable_if<true,T>{typedef T type;};
    		typedef typename enable_if< m<=n ,H>::type check_type;
    		T a; return a.F();
       }
    };

    Ca provoque une erreur C2951. J ai appiqué ce qui est recommandé par le message d erreur mais ca ne marche pas mieux!

    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
     
    struct A{ 
    	int F (){ return 1; } 
    };
     
    template< class T,int n=3> 
    struct H{
    	template<int m>
    	int h () 
    	{
    		generic<bool ,class> ref struct enable_if{};
    		generic<class T> ref struct enable_if<true,T>{typedef T type;};
    		typedef typename enable_if< m<=n ,H>::type check_type;
    		T a; return a.F();
       }
    };
    Je dois certainement mal m y prendre n est ce pas?

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tu définis souvent des structures (qui plus est templates) (et qui plus est, qui sont indépendantes en fait, et qui sont faites pour être réutilisées !) à l'intérieur de la définition de tes fonctions ?

    Quoiqu'il arrive, ce que tu essayes de faire n'est pas une bonne pratique, et même si je n'ai pas la norme sous les yeux, je pense que c'est le genre de situation qui peut poser des problèmes.

    Pourquoi veux-tu absolument mettre cela dans ta fonction h ?

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En tout les cas le mot clef généric ça existe pas en C++ :p. Et sinon +1 avec alp, pour vouloir faire une struct in class alors que c'est un composant réutilisable?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    voici le message qui m a interpelé:
    http://msdn.microsoft.com/en-us/libr...ed(VS.80).aspx

    et par curiosite je cherche àsavoir le sens des ces 2 mots

    J ai pas beasoin de rentrer les 2 ligne de enable_if dans le h mais je voulais juste voir si c etait possible.

    Le but c est d empecher des instantiations de type h<6>

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    ah oui le fait de le definir dans la fonction h c ets pour pouvoir faire une macro. C est pas orthodoxe? mais qui définit le dogme?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Math75 Voir le message
    mais qui définit le dogme?
    Le comité de normalisation
    Mais qu'est ce que c'est que cette obsession des macros ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    j essaie de voir les limites de la grammaire ( ie des possibilites du language)

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Math75 Voir le message
    j essaie de voir les limites de la grammaire ( ie des possibilites du language)
    Dans la mauvaise direction... en général on essaye de trouver les limites qui nous permettent de faire des choses pratiques, mais là ...

    Par ailleurs, le mot clé generic, s'il existe vraiment en Visual C++ ou C++/CLI, n'est pas standard quoiqu'il arrive.

    Pour Le but c est d empecher des instantiations de type h<6>, c'est déjà fait, cf ton autre sujet.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Math75 Voir le message
    j essaie de voir les limites de la grammaire ( ie des possibilites du language)
    C"est louable, mais je ne vois pas le rapport avec les macros ? A mon avis, tu pars dans une mauvaise direction.

    Citation Envoyé par Alp Voir le message
    Par ailleurs, le mot clé generic, s'il existe vraiment en Visual C++ ou C++/CLI, n'est pas standard quoiqu'il arrive.
    C'est pour que le .Net sache faire avec les templates. Ca reste du C++/CLI ou du C# mais pas du C++.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    ah ok c ets pas du c++, bon maintenant je sais que je n etais trop ignorant.
    Merci.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    Donc ce code la:

    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
     
    struct A{ 
    	int F (){ return 1; } 
    };
     
    template<bool ,class> struct enable_if{};
    template<class T> struct enable_if<true,T>{typedef T type;};
     
    template< class T,int n=3> 
    struct H{
    	template<int m>
    	int h () 
    	{
    		typedef typename enable_if< m<=n ,H>::type check_type;
    		T a; return a.F();
       }
    };
     
    int main()
    {
    	H<A > u_a;
    	int t = u_a.h<1>();
     	//t = u_a.h<6>();
    	return 0;
    }
    est raisonnable comme astuce!

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tu n'as même pas besoin de définir enable_if dans le cas par défaut. La déclaration suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<bool ,class> struct enable_if;
    template<class T> struct enable_if<true,T>{typedef T type;};
    [EDIT] : tu peux jeter un coup d'oeil à Boost.Enable if mais surtout Boost.MPL pour voir comment on torture le langage

Discussions similaires

  1. [MySQL] SQL et résultat de recherche par mot clef
    Par carelha dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/04/2006, 15h40
  2. Réponses: 1
    Dernier message: 11/03/2006, 09h55
  3. mot-clef static
    Par keil dans le forum C++
    Réponses: 8
    Dernier message: 25/01/2006, 17h11
  4. mot clef sql pour nom de champ
    Par bobinou007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 13h21

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