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 :

template et std::vector


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut template et std::vector
    Bonjour,

    Pour stoquer mes objets template dans un vecteur j'ai touver que la solution de dériver d'une class Mere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A{};
     
    template <class T>
    class _A : public A
    {
       T m_v;
    public:
       _A(T v ) : m_v(v);
       T get() { return m_v; }
    }
     
    std::vector<A*> tab;
    tab.push_back( new _A<int>(12) );
    tab.push_back( new _A<double>(1.23) );
    Mon probleme maintenant est pour ecrire un accesseur à mon attribut _A::m_v ?
    Je ne peux pas faire tab[0]->get() car il n'est pas definis dans la class A, et je ne peut pas le definir car le type peut etre n'importe quoi.
    Est qu'il existe une autre methode que l'utilisation d'un cast ?
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu as sans doute un problème de conception. Vouloir stocker la classe de base pour manipuler les dérivées, ce n'est généralement pas la bonne solution. Tu veux faire quoi au juste ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ça ressemble à du boost.any en moins bien.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Vouloir stocker la classe de base pour manipuler les dérivées, ce n'est généralement pas la bonne solution.
    N'est-ce pas justement un des principes du polymorphisme:
    utiliser des références sur des classes dérivées là où on attend une référence sur la classe de base?

    Est qu'il existe une autre methode que l'utilisation d'un cast ?
    Qu'un cast, non.
    Mais peut être qu'en downcastant avec les opérateurs de cast C++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dynamic_cast<_A*>(tab[0]);

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Il m'arrive de pratiquer ce genre de choses pour des désérializations. Mais j'évite d'abuser.

    N'aimant pas les down-castings, ni pisser plus de code utilisateur que nécessaire, je contourne en associant la variable de destination de la lecture au moment de la construction de la spécialisation.

    Ensuite, j'ai une unique fonction virtuelle d'affectation qui affecte une chaîne de caractères à la donnée qui a été attachée (si la donnée est un double, je passe par un lexical_cast ; si c'est un vecteur, je fais un push_back lexical-casté au besoin -- et avec des compilos super récents VC 8, GCC 4.1 (pas encore porté et packagé pour windows), on peut faire des trucs funs avec le SFINAE pour écrire une seule spécialisation pour tous les containers qui ont une fonction membre push_back)

    Mais je m'égare. Tant que l'on ne sait pas ce que l'OP veut faire exactement, la seule "bonne" réponse passe-partout est "mauvais design". Dans le stockage polymorphique, seul le stockage est polymorphique. Le déstockage ne peut pas l'être. Il va finir en un switch-case infernal.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    N'est-ce pas justement un des principes du polymorphisme:
    utiliser des références sur des classes dérivées là où on attend une référence sur la classe de base?
    Par "manipuler les dérivées" j'entendais "chercher à connaître leur type réel".

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

Discussions similaires

  1. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    Réponses: 11
    Dernier message: 01/03/2011, 23h34
  2. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  3. char[50] et std::vector<>
    Par tut dans le forum SL & STL
    Réponses: 9
    Dernier message: 12/10/2004, 13h26
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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