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 :

Autoriser l'instanciation pour certaines classes


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Autoriser l'instanciation pour certaines classes
    Hello,

    Connaissez-vous une technique pour n'autoriser l'instanciation d'un template que pour un certain nombre de classes, tout en gardant une définition générique ?

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonsoir,

    Tu pourrais être plus précis sur ce que tu entends par "un certain nombre de classes" ? Parce que c'est déjà le cas de manière indirect. Si la classe ne propose pas l'interface utilisé dans la définition des membres de ta classe template alors ca va poser des problèmes à la compilation.

    Si c'est pour une liste prédéfinie de classe, alors ca doit être possible en jouant avec une type list (ou variadic en C++11) et boost::mpl. Tu codes un algorithme de méta-prog semblable à std::any_of (je crois qu'il n'y est pas dans boost::mpl, mais ca se fait avec un fold), et tu fais hérité ta classe template de std::enable_if</*(*)*/,empty_type> en metant dans (*) le résultat de ton any_of et empty_type un type vide.

    Cependant je suis assez sceptique quand à l'intérêt d'un tel système, le contrat implicite imposé par l'utilisation du type dans ta classe template n'ext vraiment pas suffisant ? Si c'est parce que ce contrat est justement implicite, alors les concepts (ceux de boost par exemple) les rendent explictes.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Tu pourrais être plus précis sur ce que tu entends par "un certain nombre de classes" ? Parce que c'est déjà le cas de manière indirect. Si la classe ne propose pas l'interface utilisé dans la définition des membres de ta classe template alors ca va poser des problèmes à la compilation.
    Ma classe template sert à définir l'accès à une table et à ses chamsp, et contient uniquement un enum pour définir les accès sur les champs. Par défaut, tous les champs seront accessibles en lecture seule, et auront donc leur valeur d'enum à 0. Rien dans la définition de ma classe template ne permet d'empêcher une instanciation.

    Citation Envoyé par Flob90 Voir le message
    Si c'est pour une liste prédéfinie de classe, alors ca doit être possible en jouant avec une type list (ou variadic en C++11) et boost::mpl. Tu codes un algorithme de méta-prog semblable à std::any_of (je crois qu'il n'y est pas dans boost::mpl, mais ca se fait avec un fold), et tu fais hérité ta classe template de std::enable_if</*(*)*/,empty_type> en metant dans (*) le résultat de ton any_of et empty_type un type vide.
    Il va me falloir un peu de temps pour analyser ce bloc de texte.

    Citation Envoyé par Flob90 Voir le message
    Cependant je suis assez sceptique quand à l'intérêt d'un tel système, le contrat implicite imposé par l'utilisation du type dans ta classe template n'est vraiment pas suffisant ? Si c'est parce que ce contrat est justement implicite, alors les concepts (ceux de boost par exemple) les rendent explictes.
    Sans doute, mais je n'ai pas le droit à Boost...

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Citation Envoyé par oodini Voir le message
    Hello,

    Connaissez-vous une technique pour n'autoriser l'instanciation d'un template que pour un certain nombre de classes, tout en gardant une définition générique ?
    Il me semble que c'est possible avec Boost.MPL (certainement Boost.Fusion aussi): tu définis à l'interieur de ton template une liste de types authorisés, puis tu fais un static assert (C++11 ou celui de boost) dés les première lignes de ton template (classe ou fonction) en utilisant un des algos de MPL/Fusion pour tester si le type fournis en paramettre est l'un des types donnés.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    à moins qu'il n'entende par là "limiter à X instances", auquel cas j'ajouterais juste une factory par-dessus.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Il me semble que c'est possible avec Boost.MPL (certainement Boost.Fusion aussi): tu définis à l'interieur de ton template une liste de types authorisés, puis tu fais un static assert (C++11 ou celui de boost) dés les première lignes de ton template (classe ou fonction) en utilisant un des algos de MPL/Fusion pour tester si le type fournis en paramettre est l'un des types donnés.
    Je n'ai pas la possibilité d'utiliser Boost, mais voulant tout de même jeter un oeil, je n'ai rien vu d'approchant dans la doc de MPL...

  7. #7
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je n'ai pas la possibilité d'utiliser Boost, mais voulant tout de même jeter un oeil, je n'ai rien vu d'approchant dans la doc de MPL...
    Aprochant de quoi exactement? MPL fournis un vecteur de type et de quoi appliquer une fonction sur chaque type, il n'y a pas besoin de plus, si?

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    http://www.boost.org/doc/libs/1_36_0...nual/fold.html

    C'est celui-ci d'algo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fold<types,false_,or_<equal_to<_2,T> ,_1> >::type
    (Quelque chose comme ca)

    Et pour rendre ca plus lisible, on doit pouvoir faire (à vérifier, j'utilise pas MPL tout les jours) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<class Sequence, class Value>
    struct any_of : 
      fold<Sequence,false_,or_<equal_to<_2,Value> ,_1> >
    { };
    Que tu devrais pouvoir ensuite utiliser avec une assertion comme te le propose klaim :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class T>
    struct A
    {
      BOOST_MPL_ASSERT((any_of<types,T>));
    };
    Où types est ta liste de type autorisé

    Si tu n'as pas le droit à boost, alors tu fais pareil en recodant fold _or et equal_to, et en utilisant un autre système d'assertion à la compilation (C++11 par exemple). Pour recoder ces éléments tu peux te baser sur le code de boost::mpl.

    PS: A la place de _or on peut aussi utiliser un _if, et à la place d'un fold on peut utiliser un des autres algorithmes d'itération (mpl::accumulate par exemple).

    PPS: La solution de l'assertion (pour provoquer l'erreur) proposé par klaim est surment bien mieux que la mienne je pense.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Bon, je crois qu'il va me falloir plonger dans le bouquin d'Abrahams.

    Merci à tous !

Discussions similaires

  1. Autorisations pour certains
    Par raphchar dans le forum Langage
    Réponses: 8
    Dernier message: 08/03/2011, 18h04
  2. Réponses: 1
    Dernier message: 05/11/2010, 10h07
  3. Réponses: 3
    Dernier message: 19/03/2009, 14h59
  4. Réponses: 3
    Dernier message: 15/09/2008, 09h08
  5. Autorisations pour certains enregistrements
    Par mpereg dans le forum Sécurité
    Réponses: 1
    Dernier message: 22/05/2008, 23h27

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