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

C++ Discussion :

fonction à contenu spécialisé en fonction du nombre d'arguments passés dans un template


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut fonction à contenu spécialisé en fonction du nombre d'arguments passés dans un template
    Bonjour,

    J'ai le code suivant :

    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
    void test(Position* p, Motion* m)
    {
        std::cout << p->x;
        std::cout << p->y;
        std::cout << m->n;
    }
     
    template <typename...Ts>
    struct SYSTEM
    {
        std::vector<Component*> vector;
     
        SYSTEM()
        {
            vector.push_back(new Position);
            vector.push_back(new Motion);
            static_cast<Position*>(vector[0])->x = 45;
            static_cast<Position*>(vector[0])->y = 2;
            static_cast<Motion*>(vector[1])->n = 90;
        }
     
        template <typename...Tss>
        void castComponents(Tss...args)
        {
            test(static_cast<Ts*>(args)...);
        }
     
        void update()
        {
            castComponents(vector[0],vector[1]);
        }
    };
     
     
    int main()
    {
        SYSTEM<Position,Motion> e;
     
        e.update();
     
        return 0;
    }
    J'aimerais que la fonction castComponent se spécialise en fonction du nombre de type passés dans la construction d'un SYSTEM. Je m'explique. Si, mettons, je construis un SYSTEM<int,char,double>, trois types sont passés, et j'aimerais que castComponent devienne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void update()
    {
        castComponents(vector[0],vector[1],vector[2]);
    }
    Idem si je construis un SYSTEM<int,float,std::string,char,double>, 5 types, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void update()
    {
        castComponents(vector[0],vector[1],vector[2],vector[3],vector[4]);
    }
    Je m'étais dit que j'allais faire de castComponent une fonction template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <int n>
    void update();
     
    template <>
    void update<2>()
    {
        castComponent(vector[0],vector[1]);
    }
    ... mais c'est impossible. J'ai aussi essayé de passer par des macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define MACRO(n) MACRO##n
     
    #define MACRO1 vector[0]
    #define MACRO2 vector[0],vector[1]
    #define MACRO3 vector[0],vector[1],vector[2]
    ... mais le MACRO(sizeof...(Ts)) ne passe pas

    DU COUP je me demandais si un brillant génie pouvait m'aider à résoudre mon problème

    Merci !
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Lu !

    C'est étrange d'utiliser un vector quand la taille est statique, pourquoi pas un std::array ?
    Et gaffe au fuite mémoire, parce que des pointeurs nus sur des donnée allouées, c'est super risqué: std::unique_ptr.

    Pour répondre au problème: std::index_sequence_for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<class, std::size_t... index>
    void updateHelper(std::index_sequence<index...>)
    {
      castComponents(vector[index]...);
    }
     
    void update()
    {
      updateHelper(std::index_sequence_for<Ts...>{});
    }
    (pas test)

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut
    Hellow,

    Dans mon exemple il n'y a que deux éléments, en vrai il y en a plus

    Merci du conseil pour les pointeurs, sale habitude que je me traine !

    Ce que tu as posté répond parfaitement à mon besoin, merci beaucoup !!
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Citation Envoyé par MrPchoun Voir le message
    Dans mon exemple il n'y a que deux éléments, en vrai il y en a plus
    Ça n'en reste pas moins statique. Une taille de sizeof...(Ts) est déterminé à la compilation .

    D'ailleurs, en regardant un peu mieux, et comme le tableau contient des types différents, std::tuple serait plus adapté et les allocations dynamiques et casts évités.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    La question du vector ne se pose pas à vraie dire, si tu espères avoir
    SYSTEM<int,float,std::string,char,double>, 5 types,
    , tu dois utiliser un tuple. Jamais tu n'auras 5 types différents dans un vector.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/10/2015, 17h54
  2. Déduction du nombre d'arguments d'un foncteur template
    Par Trademark dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2012, 14h15
  3. Connaitre le nombre de champs passés dans un submit
    Par identifiant_bidon dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/12/2011, 10h56
  4. Nombre d'arguments passés à l'URL
    Par alter dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2009, 17h10
  5. Réponses: 1
    Dernier message: 06/11/2005, 18h55

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