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.
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>
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 ?
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 ?
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
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"); ?
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
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.
Eug
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Eug
Eug