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 :

Question d'élégance avec les templates.


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut Question d'élégance avec les templates.
    Bonsoir,

    J'ai un petit soucis dans la réalisation d'un gestionnaire de ressources.
    J'ai crée un singleton CRessourcesManager qui charge des ressources depuis le disque avec une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<class T>
        QSharedPointer<T> load<T>(QString filename){
            QListIterator it(m_loaders);
            while(it.hasNext()){
                IRessourcesLoader loader = it.next();
                if(loader.isValid<T>()){
                    return loader.load<T>(filename);
                }
            }
        }
    IRessourcesLoader est une classe interface qui doit implémenter le chargement d'un type de données.
    Donc pour chaque implémentation de IRessourcesLoader ma méthode doit vérifier si le loader est abilité à charger le type en question.
    J'aimerai conserver la possibilité d'écrire n'importe qu'elle implémentation de IRessourcesLoader et de simplement avoir à l'ajouter à CRessourcesManager avant d'apeller la méthode load avec le type attendu.

    Existe-t-il une méthode plus élégante ? Que d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(loader.isValid<T>()){
            return loader.load<T>(filename);
    }
    Merci

  2. #2
    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
    isValid() fait quoi?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Cette méthode est sensé vérifier la compatibilité entre le type demandé et le type géré par l'implémentation de IRessourcesLoader.

    Je crois avoir trouvé ce que je cherchais :
    http://loulou.developpez.com/tutorie...eur3d/partie4/
    Il est vraiment incroyable ce mec xD, je trouve son code presque mystique parfois...

    Merci

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    ca serait encore mieux sans Singleton

  5. #5
    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

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Je confirme : préfère les traits au code proposé par loulou. Le code de loulou est sympathique, mais il n'est pas extensible. Hors, tu vas vouloir rajouter des loaders, et peut-être permettre à tes utilisateurs de rajouter des loaders - et eux ne peuvent pas modifier ton code.

    Les traits, du fait qu'ils sont spécialisable à volonté, permettent au code client d'étendre le code de la librairie sans avoir à le modifier.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    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
    Citation Envoyé par Joel F Voir le message
    ca serait encore mieux sans Singleton
    Et bien tu vois, j'ai eu l'occasion d'y réfléchir assez intensivement par le passé, et dans ce cas précis (Ressource manager pour un jeux), c'est une des rares fois où j'ai pu justifier un singleton (et pourtant je les ai en horreur).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Super, merci les classes de politiques c'est exactement ce que je cherchais, mais je savais pas que ça existé !
    Rassurez moi c'est quand même un concept relativement avancé du c++ non ? Je dois m'y reprendre à plusieurs fois avant de saisir les fonctionnements expliqués dans les liens...

    Pour ce qui est du singleton du gestionnaire de ressources, je n'ai aucun intérêt à avoir plusieurs instances d'une classe qui vise à centraliser la gestion de la mémoire et plus précisément à limiter les chargements depuis le disque... Donc il me semble qu'un singleton est justifié dans ce cas.

  9. #9
    En attente de confirmation mail

    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 : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Le singleton ne sert pas qu'a assurer l'uncité d'une instance, il vise à fournir un point d'accés global à une instance, or (et il me semble que c'est expliqué dans l'article d'Emmanuel Deloget), il est souvent possible de centraliser dans une portion restreinte de code l'utilisation de ton manager (avec une bonne architecture), il n'y a donc plus besoin d'accés global, la seul chose qui reste c'est l'unicté, et pour ca il suffit de ne créer qu'une instance.

  10. #10
    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
    Citation Envoyé par Agoudard Voir le message
    Super, merci les classes de politiques c'est exactement ce que je cherchais, mais je savais pas que ça existé !
    Rassurez moi c'est quand même un concept relativement avancé du c++ non ? Je dois m'y reprendre à plusieurs fois avant de saisir les fonctionnements expliqués dans les liens...

    Pour ce qui est du singleton du gestionnaire de ressources, je n'ai aucun intérêt à avoir plusieurs instances d'une classe qui vise à centraliser la gestion de la mémoire et plus précisément à limiter les chargements depuis le disque... Donc il me semble qu'un singleton est justifié dans ce cas.
    J'appellerais pas ça du C++ avancé, mais c'est pas non plus du tout venant...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    J'appellerais pas ça du C++ avancé, mais c'est pas non plus du tout venant...
    Adrei Alexandrescu dirait du C++ moderne. D'où le titre de son bouquin.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  12. #12
    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
    Oui mais il l'a sorti y'a longtemps
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    Oui mais il l'a sorti y'a longtemps
    Il n'empêche que le coté meta-programmation est par certains aspects très moderne. Il faut du temps pour bien apprécier la force des templates, et les évolutions du standard vont encore améliorer les choses (notamment les évolutions sur SFINAE, qui vont faire beaucoup de bien).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Rebonjour,

    Je suis de retour avec un problème dans les classes de politiques. Je pense n'avoir pas totalement cerné le fonctionnement.

    Je tente donc d'avoir une méthode du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CResourceManager::get().load<LoaderPolicy>(QString filename);
    Avec un type de retour qui me pose problème...
    J'aimerais qu'il y est un lien entre LoaderPolicy et le type de retour.
    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QSharedPointer<typename LoaderPolicy::ret_type>
    Mais le compilo m'indique que la méthode load de CResourceManager est introuvable...

    Voici le code en détails

    CResourceManager :
    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
     
    class CResourceManager : QObject
    {
        Q_OBJECT
     
    public:
        static CResourceManager& get();
     
        template<typename TLoader>
        QSharedPointer<typename TLoader::ret_type> load(QString filename){
            return TLoader::load(filename);
        }
     
    private:
        CResourceManager();
        ~CResourceManager();
    };
    TTextureLoaderPolicy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct TTextureLoaderPolicy{
     
        static const GLuint ret_type;
     
        static QSharedPointer<GLuint> load(QString filename){
            ....
            return QSharedPointer<GLuint>(// Un pointeur quelconque);
        }
    };
    Quelqu'un peut m'éclairer sur mon erreur ?

  15. #15
    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
    CResourceManager::get().template load<LoaderPolicy>(QString filename);
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Euh, alors là... je suis complètement paumé.
    Pourquoi le mot clé template est nécessaire ?

    dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CResourceManager::get().template load<TLoaderPolicy>(QString filename);
    Il faut préciser que la méthode load est un template ?
    Pourquoi ce mot clé n'est pas présent dans tout les cas ?

    Merci pour le coup de main

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    AHA ! J'ai trouvé !

    Voilà la solution :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main(int argc, char* argv[]){
     
        QApplication app(argc, argv);
     
        CResourceManager::get().load<TTextureLoaderPolicy>(QString("test"));
     
        return app.exec();
    }
    ResourceManager.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
        template<typename TLoaderPolicy>
        typename TLoaderPolicy::ret_type load(QString filename){
            return TLoaderPolicy::load(filename);
        }
    ...
    TextureLoaderPolicy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct TTextureLoaderPolicy{
    
        typedef GLuint ret_type; // Anciennement : static const GLuint ret_type;
    
        static GLuint load(QString filename){
            return 0;
        }
    };
    Voilà Merci pour le coup de main.

    S'agit-il d'une solution acceptable ? Pour ajouter un loader il me suffit de créer une classe de politique, et faire l'appel au gestionnaire avec cette classe comme paramètre de template.

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

Discussions similaires

  1. wpf: probleme avec les templates
    Par mk.wassim dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 18/03/2009, 17h54
  2. probleme avec les templates d'un formview
    Par devdotnet dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/11/2007, 09h32
  3. [Delphi 7] Questions pour débuter avec les bases de données
    Par DamKre dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/09/2007, 16h06
  4. Erreur de link avec les templates
    Par suiss007 dans le forum C++
    Réponses: 6
    Dernier message: 04/01/2007, 11h09
  5. Probleme avec les templates
    Par TeC_MaN dans le forum C++
    Réponses: 2
    Dernier message: 08/01/2006, 14h53

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