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 :

Problème de fabrique


Sujet :

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 Problème de fabrique
    Bonjour,

    En fonction d'un entier donné, je dois créer un objet d'un type donné. Hop, on va tout droit vers une fabrique.

    Mon problème est que je dois refiler le produit de cette fabrique à une fonction qui ne va pas consommer ce produit de manière polymorphique classique, car il utilise un polymorphisme statique.
    Le type de l'argument en question est templatisé, et le polymorphisme est implémenté sous forme de respect d'un "concept". Tout est donc géré de manière statique. Et là, on sort hautement du design pattern "fabrique", qui est basé sur le virtualité.

    Bref, je dois déterminer à l'exécution un type sans pouvoir faire de polymorphisme dynamique.

    Sinon, il y a la possibilité de faire un switch, avec chaque case créant le bon type d'objet, et appelant la fonction en question. Comme la fonction prend 15 arguments (ce n'est pas moi qui l'ai faite !), j'aurais aimé éviter cette solution.

    Je vais essayer de voir dans Boost::MPL si on peut indexer dynamiquement une liste de types....

    PS : apparemment, le decltype(auto) de C++ 14 aurait pu me sortir d'affaire, mais je suis bloqué à C++11.

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    J’ai un peu de mal. Soit tu es statique, soit tu es dynamique, mais mixer les deux, ça ne fait pas toujours bon ménage. Surtout, si le type de retour dépend d’un paramètre entier non connu à la compilation, ça veut dire que le type de retour est un variant (pas le choix).

    Mais ce dont tu as besoin, ce ne serait pas finalement plutôt un visiteur ? (tu récupères le variant, et le fait de visiter le variant va appeler ta fonction à 15 arguments sur le bon type). Ça t’oblige à écrire les n appels avec 15 arguments, mais il y a probablement moyen de factoriser ça, et ça parait nettement plus propre que le switch.

  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 white_tentacle Voir le message
    J’ai un peu de mal. Soit tu es statique, soit tu es dynamique, mais mixer les deux, ça ne fait pas toujours bon ménage. Surtout, si le type de retour dépend d’un paramètre entier non connu à la compilation, ça veut dire que le type de retour est un variant (pas le choix).
    C'est effectivement mon problème, mais je n'ai pas accès à toutes les manettes.

    Citation Envoyé par white_tentacle Voir le message
    Mais ce dont tu as besoin, ce ne serait pas finalement plutôt un visiteur ? (tu récupères le variant, et le fait de visiter le variant va appeler ta fonction à 15 arguments sur le bon type). Ça t’oblige à écrire les n appels avec 15 arguments, mais il y a probablement moyen de factoriser ça, et ça parait nettement plus propre que le switch.
    J'ai l'impression que je suis en train de m'en sortir.
    L'objet attendu doit en fait être un foncteur. Je suis donc en train de créer une fonction qui me me renvoie un std::function<>, dont le type statique qui m'embête est enrobé grâce à un std::bind (cf mon auter question posée récemment).

    Je me retrouve donc avec une fonction constituée d'un switch dont chaque cas fait deux instructions : création de l'instance, puis le return d'un std::bind.

    Ça a l'air de fonctionner. Je vous tiens au jus.

  4. #4
    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
    OK, je m'en suis sorti grâce au bind. Ainsi, j'ai pu avoir un type de retour commun à tous les types, sans qu'il y ait besoin d'héritage.

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

Discussions similaires

  1. [SP-2007] Problème pour fabriquer un flux de travail avec Designer
    Par sophieetfrederic dans le forum SharePoint
    Réponses: 1
    Dernier message: 18/12/2012, 14h15
  2. Réponses: 2
    Dernier message: 17/02/2012, 11h03
  3. Problème de conception : patron "fabrique" ?
    Par oodini dans le forum C++
    Réponses: 11
    Dernier message: 10/09/2008, 18h16
  4. Problème pour fabriquer une regex
    Par v4np13 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/01/2008, 23h01
  5. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

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