Partage
  • Partager sur Facebook
  • Partager sur Twitter

Idee(s) d'implementation

Sujet résolu
    28 septembre 2016 à 21:33:39

    Salut à tous :).

    J'ai actuellement un problème avec les templates. En gros, imaginons qu'on ait une classe A, qui en fonction des paramètres passés via une méthode , ajoute dans un tableau une classe template d'un autre objet.

    un exemple de code pour être plus clair: (les pointeurs nus sont juste pour simplifier l'ecriture)

    class IRessource { virtual ~IRessource = 0 {} };
    class Texture : public IRessource {};
    class Model3D : public IRessource {};
    
    
    template<class T>
    class Templ // une sorte de cache
    {
    public:	
    	template<class... Args>
    	T get(Args... args){/*...*/}
    }
    
    class A
    {
    	std::map<IRessource*, Templ<?>> m; //<==le probleme
    public:
    	template<class T, class... Args>
    	const T& get(Args&&... args)
    	{
    		auto it = m.find(new T);
    		/* 
    		création et ajout implicite 
    		d'une classe Templ<T>()
    		au cas où elle n'existe pas:
    		une sorte de cache de cache
    		*/
    		return it->second.get(std::forward<Args>(args)...);
    	}
    }
    
    
    //exemple d'utilisation
    auto t = A.get<Texture>("palmface");
    auto m = A.get<Model3D>("earth");

    J'ai pensé au polymorphisme mais, apparemment template et polymorphisme sont diamétralement opposés.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter

    Eug

    Anonyme
      28 septembre 2016 à 21:42:43

      Tu pourrais utiliser le typeid comme cle pour ta map : http://en.cppreference.com/w/cpp/language/typeid bien que je ne comprenne pas trop l'interet de faire ce genre de chose etant donne que tu connais deja le type de données que tu veux...

      Et pour ce qui est de la valeur, std::shared_ptr<IResource> 

      -
      Edité par Anonyme 28 septembre 2016 à 21:43:28

      • Partager sur Facebook
      • Partager sur Twitter
        28 septembre 2016 à 21:43:36

        Lu'!

        Les template permettent justement le polymorphisme statique. Donc non, ce n'est pas opposé du tout.

        Concernant le problème que tu cherches à résoudre, cela n'a probablement pas trop de sens en fait. Surtout que là du coup le code est pas très logique. Qui s'occupe d'assurer que "palmface" a effectivement le type Texture ?

        Et pense à jeter un oeil à ça : https://openclassrooms.com/forum/sujet/sfml-comment-gerer-les-textures-d-un-jeu-video .

        • Partager sur Facebook
        • Partager sur Twitter

        Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

          28 septembre 2016 à 22:00:45

          AwpSoLeet a écrit:

          Tu pourrais utiliser le typeid comme cle pour ta map : http://en.cppreference.com/w/cpp/language/typeid 

          Pas faux ^^

          AwpSoLeet a écrit:

           tu connais deja le type de données que tu veux...

           Bah non puisque tantôt la map aura une paire de  {Texture, Templ<Texture>}, tantôt une autre de {Model3D, Templ<Model3D>}, etc.... Du coup, je n'arrive a trouver le type commun entre Templ<Texture> et Templ<Model3D> etc...

          Ksass`Peuk a écrit:

           Surtout que là du coup le code est pas très logique. Qui s'occupe d'assurer que "palmface" a effectivement le type Texture ?

          Et pense à jeter un oeil à ça : https://openclassrooms.com/forum/sujet/sfml-comment-gerer-les-textures-d-un-jeu-video .

          J'y ai deja regardé et en fait, la classe Templ est une version ultra simplifiée de ta classe cache (dans le lien). Du coup c'est la fonction Templ::get() qui s'occupe de fournir la texture ayant l'id demandé ou en cas de besoin de la créer et ensuite la fournir.

          Et je ne comprends pas pourquoi vous dites tous les deux que cela n'a pas d'interêt; peut etre je m'exprime mal?



          -
          Edité par eugchriss 28 septembre 2016 à 22:06:15

          • Partager sur Facebook
          • Partager sur Twitter

          Eug

          Anonyme
            28 septembre 2016 à 22:24:53

            eugchriss a écrit:

            AwpSoLeet a écrit:

             tu connais deja le type de données que tu veux...

             Bah non puisque tantôt la map aura une paire de  {Texture, Templ<Texture>}, tantôt une autre de {Model3D, Templ<Model3D>}, etc.... Du coup, je n'arrive a trouver le type commun entre Templ<Texture> et Templ<Model3D> etc...


            Justement si, pourquoi aurais tu besoin de faire du type erasure alors que tu sais quand tu passes un Texture que tu veux un Templ<Texture> ? D'ailleurs pourquoi as-tu besoin de A ?

            Pourquoi ne pas remplacer a.get<Texture>("lolifront"); par Texture::get("lolifront"); ?

            • Partager sur Facebook
            • Partager sur Twitter
              29 septembre 2016 à 3:07:23

              AwpSoLeet a écrit:

              Justement si, pourquoi aurais tu besoin de faire du type erasure alors que tu sais quand tu passes un Texture que tu veux un Templ<Texture> 

              exact! je n'avais pas vu ça comme cela.

              AwpSoLeet a écrit:

               D'ailleurs pourquoi as-tu besoin de A ?

              Pourquoi ne pas remplacer a.get<Texture>("lolifront"); par Texture::get("lolifront"); ?

              encore pas faux et merci ^^



              -
              Edité par eugchriss 29 septembre 2016 à 3:07:56

              • Partager sur Facebook
              • Partager sur Twitter

              Eug

              Idee(s) d'implementation

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown