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 :

Un tableau multitype est-il rentable?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Un tableau multitype est-il rentable?
    Bonjour,
    J'ai réalisé un patite classe(template) permettant de stocker des objet de plusieurs types en évitant les pointeurs, l'allocation dynamique, les fonctions virtuelles...
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    template<class T>
    struct MultyTypesContainer;
     
     
     
    template<class T>
    struct SingleTypeContainer
    {
        void insert(const T& val)
        {
             set_.insert(val);
        }
     
        template<class Func>
        Func call_for_each(Func f)
        {
            return std::for_each(set_.begin(), set_.end(), f);
        }
     
    private:
    	std::set<T> set_;
    };
     
     
    template<class Head, class Tail>
    struct MultyTypesContainer<Loki::Typelist<Head,Tail> >
    {
        typedef typename Loki::Typelist<Head,Tail> TList;
        enum{size = Loki::TL::Length<TList>::value};
        typedef typename Loki::GenScatterHierarchy<TList,SingleTypeContainer> MultyTypesContainerImplementation;
        MultyTypesContainerImplementation impl_;
        template<class Func, int i>
        Func call_for_each(Func f, Loki::Int2Type<i>)
        {
            f = Loki::Field<i>(impl_).call_for_each(f);
    	return call_for_each(f, Loki::Int2Type<i-1>());
        }
     
        template<class Func>
        Func call_for_each(Func f, Loki::Int2Type<0>)
        {
    	return Loki::Field<0>(impl_).call_for_each(f);
        }
     
    public:
        template<class T>
        void insert(const T& val)
        {
    	impl_.SingleTypeContainer<T>::insert(val);
        }
        template<class Func>
        Func call_for_each(Func f)
        {
    	return call_for_each(f, Loki::Int2Type<size-1>());
        }
    };
    Je voulais savoir si vous pensez qu'une classe comme celle-ci peut être utile ou au contraire qu'elle pourra encombrer un plus ma corbeille de projets ratés ?

    PS: En appelant 500000 fois une fonction(membre) vide a partir d'un ensemble de 1000 objets j'ai entre 7% et 8% de gain de vitesse.

    EDIT:
    En fait, pour éviter d'écrire des tonnes de foncteur j'ai fait un petit macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define CALL_MEMBER_FUNCTION0(function) \
                struct \
    	    { \
    		template<class T>\
    		void operator()(T& obj) \
    		{\
    	            obj.function(); \
    	        }\
    	    }
    et je l'utilise avec un typedef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef CALL_MEMBER_FUNCTION0(get_statistics) GetSatisticsFunctor;
     
    typedef MultyTypesContainer<Classe1, Classe2> Conteneur;
     
    Conteneur stats;
    stats.call_for_each(GetSatisticsFunctor());
    Par contre je peux pas faire mon typedef(le premier) dans un fonction : les classes locales ne peuvent pas avoir de fonctions membres template.

    PS2 : J'ai aussi codé un iterateur mais bon, vu ses performances, je vais éviter de le poster...
    Dernière modification par Invité ; 29/01/2010 à 16h42.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Par défaut
    Du point de vue d'un architecte, quelques questions :

    1) dans quel cas est-ce que je peux avoir besoin d'une telle classe ? As-tu identifier un besoin clair (parce que la programmation pour la programmation, ça a quand même des limites... )?

    2) Comment puis-je l'utiliser, une fois que j'ai mis des carottes et des presse-papiers dans le même sac ?

    3) Comment faire pour récupérer une valeur dans ce conteneur ? (parce que bon, contenir des valeurs, c'est bien, mais un jour ou un autre il faudra les traiter...)

    4) Que faire si les différents types stockés n'ont pas la même interface ? (c'est nécessaire pour l'utilisation du foncteur que tu donnes en exemple. Plus généralement, si tu comptes utiliser call_for_each() sur le conteneur entier, le foncteur que tu passes en paramètre
    * doit être capable de retrouver, via par exemple des traits, les caractéristiques des différents types d'objet manipulés
    * ou, au moins, être spécialisé pour traiter chacun des types d'objet manipulés.)

    5) Si les différents types stockés ont la même interface, pourquoi est-ce le cas ?

    D'autres questions peuvent survenir dans mon esprit torturé d'un instant à l'autre...
    [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.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Quelle différence avec boost::variant ? C'est multi-type (disons prédéfinis). L'accès se fait via des visiteurs.
    Je pense pas avoir besoin de plus que ça. D'ailleurs, comme le souligne Emmanuel, après on sait plus les traiter, non ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Tout d'abord merci pour vos réponse.
    1) Je pensais avoir quelques cas:
    *si on veut conserver le type exacte d'un objet(notamment lorsque on veut appeler un fonction utilisant de deux ces objets et mettant en place un comportement différent en fonction de leurs types; on pourrait utiliser un double dispatcher mais ça demanderait au mieux un static_cast, au pire un dynamic)
    *si on veut éviter la surcharge de coût à l'éxecution

    2)Je pensais aussi rajouter des accesseurs pour récupérer en fonction du type

    3)Par un foncteur, non?

    4)Honnêtement, je n'y avais pas pensé, mais c'est un bonne idée

    5)Ca rejoint un peut tout les autres points

    D'après ce que j'ai compris, boost::variant ne peut pas contenir à la fois "hello_world" et 5.0f .

    En fait, ce "conteneur" part de ce principe : "il est inutile de faire du dynamique quand l'on peut faire du statique"

    J'espère avoir été le plus explicite possible.Vos conseils vont sans doute me permettre de m'améliorer(ca sera pas plus mal).

  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
    Par défaut
    Salut,
    Boost.Variant est une 'union'. Ensuite tu peux avoir un conteneur classique (list, vector, map, etc.) de Boost.Variant pour avoir un conteneur hétérogène.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Alors oui, c'est pour l'instant le même fonctionnement(enfin un conteneur de boost::variant contient toutes les opérations du mien). Mais je pourrais "améliorer" le mien en rajoutant un fonction pour obtenir tout les objet d'un (ou plusieurs) type(s).

    Je rajoute à mes cas d'utilisation : il est parfois désirable d'obtenir un conteneur triée en fonction du type(exact) des objets qu'il contient.

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

Discussions similaires

  1. [AJAX] construction d'un tableau -> où est l'erreur?
    Par noobC dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/08/2008, 15h36
  2. [MySQL] Peu importe la taille du tableau, SQL est censé tout enregistrer(non pas foreach :D )
    Par Dermiste dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/04/2008, 01h47
  3. en quoi l init de mon tableau n 'est pas bonne ?
    Par poulette3000 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 31/10/2007, 17h29
  4. Réponses: 8
    Dernier message: 19/07/2007, 16h40
  5. afficher juste les colonnes du tableau c'est possible !?
    Par moonia dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 26/07/2006, 08h58

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