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 :

Itérer sur des types de données


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Par défaut Itérer sur des types de données
    Bonsoir,

    Soit une architecture assez simple comme celle decrite ci-dessous

    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 A
    {
    .....
    };
     
    template <class TYPE>
    class B
    {
    public :
    	void Set(SmartPtr<Image<TYPE>> p_pData) {
    		m_pData = p_pData;
    	};
     
     
    protected :
    	SmartPtr<Image<TYPE>> m_pData;
    };
    a l'utilisation, je fais quelque chose comme ca (dans un autre composant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class TYPE>
    void Component::SetImage(SmartPtr<TYPE> p_pImg)
    {
    	SmartPtr<B<TYPE>> l_pB(new B<TYPE>());
    	l_pB->Set(p_pImg);
    	m_pA = l_pB;// m_pA est un SmartPtr<A>
    }
    Mon probleme se pose pour acceder a une donnée de B:m_pData qui ne depend pas non dependante du type TYPE mais qui necessite que je connaisse le type reel
    donc j'en suis a écrire une méthode

    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
    ImageData Component::GetImageData() const
    {
    	{
    		SmartPtr<B<BYTE>> l_pB = dynamic_pointer_cast<B<BYTE>>(m_pA);
    		if (l_pB) return *l_pB;	
    	}
    	{
    		SmartPtr<B<WORD>> l_pB = dynamic_pointer_cast<B<WORD>>(m_pA);
    		if (l_pB) return *l_pB;	
    	}
    	{
    		SmartPtr<B<RGBA>> l_pB = dynamic_pointer_cast<B<RGBA>>(m_pA);
    		if (l_pB) return *l_pB;	
    	}
     
    	return ImageData(0);	// invalid ImageData
    }
    J'aimerai remplacer les 3 blocs 'identiques' par une boucle sur les types, a la maniere de boost::mpl ou autre chose.
    Quelque chose qui donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ImageData Component::GetImageData() const
    {
    	for type in {BYTE,WORD,RGBA) {
    		SmartPtr<B<type>> l_pB = dynamic_pointer_cast<B<type>>(m_pA);
    		if (l_pB) return *l_pB;	
    	}
     
    	return ImageData(0);	// invalid ImageData
    }
    Quelqu'un sait-il si c'est possible de faire ca et si oui m'expliquer comment faire ?

    merci
    Vincent

  2. #2
    Membre Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Non, on n'itere pas sur des types pour faire des cascades de dynamic_cast. Jamais. Meme sou sla torture.

    Ce que ce code indique, c'est aue tu as besoin d'une méthode *virtuelle* qui va se charger, en fonction du type concret de B<T>, de faire l'extraction/conversion.

  3. #3
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Par défaut
    bonjour,

    effectivement l'utilisation d'une methode virtuelle dans A, surchargée dans B aurait réglé le pb mais je n'ai pas développé les classes A et B et je ne peux pas intervenir dessus.

    De meme, je ne peux pas deriver de B en 'myB' car il y a des classes C,D,..., (non présentées dans ce post) qui héritent de B et que j'utilise ailleurs

    d'ou ma question ..

    V

  4. #4
    Membre Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    fait toi un Adaptor qui adapte A,B etc dans des clases sur lesquelles tu a la main mise et travaille avec ca

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/11/2007, 23h31
  2. Format des type de données
    Par caballero dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 09/07/2007, 17h58
  3. [SQL 2000] Question sur les types de données
    Par Angath dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/11/2006, 14h05
  4. Extension des Types de Données(CHAR,CLOB)
    Par blackstreet dans le forum Oracle
    Réponses: 9
    Dernier message: 28/04/2006, 22h39
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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