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 :

[C++] Template et paramètres optionels


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [C++] Template et paramètres optionels
    Bonjour à tous,

    Je me demandais s'il était possible de savoir le nombre de paramètre réellement passé à mon constructeur de classe (sans passé par les va_arg, va_list,... du C) qui a des "template par défaut" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename T1, typename T2 = void*, typename T3 = void*>
    class MA_CLASSE
    {
    MA_CLASSE(T1 _p1, T2 _p2 = (void*)0, T3 _p3 = (void*)0)
            : p1(_p1),  p2(_p2),  p3(_p3)
    };
     
    // exemples d'appel :
    MA_CLASSE<int> c1; // un seul paramètre fourni
    MA_CLASSE<int, float> c2; // 2 params
    MA_CLASSE<int, flat, int> c3; // 3 paramètres
    Je sais que ce n'est peut être pas très élégant de mettre des "void*" en C++ mais je n'ai pas trouvé d'autre solution pour pouvoir instancier ma classe template avec un ou plusieurs types.

    Voilà, Merci à vous
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Pour prendre les choses dans l'ordre :

    le nombre de paramètre réellement passé à mon constructeur de classe
    Utiliser l'overload de constructeur au lieu de paramètre par défaut ?

    Si tu peux utiliser le C++11 tu peux considérer les variadic template qui pourraient convenir.

    Sinon il y a un problème dans ton implémentation, quand tu utilises des arguments par défaut dans le constructeur tu leur affectes une valeur, or tu n'es pas sûre que cette valeur soit correcte en fonction du type. Par exemple je peux appeler ta classe comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ma_classe<int, MonType> m(5);
    Si MonType n'a pas un opérateur d'affectation prenant un (void*) alors tu auras une erreur de compilation.

    Il existe plusieurs solutions pour régler ce genre de problème mais ça dépend vraiment du contexte et de la sémantique de ta classe. Si tu veux un avis qui soit personnalisé, dit nous ce que tu essayes de faire avec ta classe.

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Est-ce que tu cherches a avoir un tuple (ou avec boost si tu ne peux pas utiliser le c++11) ?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Si tu peux utiliser C++11, tu aurais presque intérêt à utiliser les variadic template, de manière a avoir un nombre d'argument réellement variable.

    Tu pourrait savoir exactement le nombre d'élément que tu as sous grace à sizeof :
    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
    #include <iostream>
    template <typename ... Args>
    struct MyStruct
    {
        enum {size = sizeof...(Args)};
    };
    using NoArgs = MyStruct<>;
    using OneArg = MyStruct<int>;
    using TwoArgs = MyStruct<int, std::string>;
    int main()
    {
        std::cout<<"NoArgs has "<<NoArgs::size << " arguments"<<std::endl
                 <<"OneArg has "<<OneArg ::size << " arguments"<<std::endl
                 <<"TwoArgs has "<<TwoArgs ::size << " arguments"<<std::endl;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Avec l'overload du contructeur, ca marche

    Je viens de me renseigner sur le variadic template, ca a l'air super puissant ce truc (je ne connaissais pas du tout).

    Par contre, comment on fait pour récupérer les types et les valeurs des paramètres vairables ? lol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <typename ... Args>
    struct MyStruct
    {
        enum {size = sizeof...(Args)};
     
        MyStruct()
        {
            std::cout << "comment récupérer mes types ?" << std::endl;
        }
    };
     
    // et son appel :
    MyStruct<int, float> toto(5, 10.5);
    Le but en fait est de créer une classe avec des paramètres génériques variables. Donc si je fais par exemple : Param<int, float, double>, je voudrais créer une classe avec 3 membres int m_1, float m_2, double m_3
    Et si j'appel comme cela : Param<int> alors je n'ai que int m_1

    PS : je n'ai pas trouvé de très bon article sur ce sujet (en français ), celui la est assez incompréhensible :
    http://blog.emmanueldeloget.com/inde...es-variadiques

    PS 2 : Je n'utilise pas Boost.

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Au risque de répéter un peu ce qui a déjà été dit : pour t'aider plus au delà, il faudrait savoir ce que tu cherches à faire avec cette classe. L'exemple de Koala est joli, mais il ne te montre pas ce qu'il y a de plus dur à faire, c'est à dire justement créer des variables membres selon les types templates.

    Tu as des gens qui ont déjà pris la peine de le faire, par exemple dans le standard c++11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <tuple>
    #include <iostream>
     
    int main() {
        std::tuple<int, float> toto(5, 10.5);
        std::cout << "premiere valeur : " << std::get<0>(toto) << std::endl;
        std::cout << "seconde valeur  : " << std::get<1>(toto) << std::endl;
        return 0;
    }
    Plusieurs questions donc :
    • est-ce que toutes tes instances de MaClasse doivent avoir 3 variables membres, et tu veux juste pouvoir n'en initialiser que quelques unes ?
    • dans le cas contraire, est-ce que tu auras toujours 3 types au maximum, ou est-ce que ça peut changer ?
    • et est-ce que tu vas toujours utiliser MaClasse avec de types fixes (ex : int, float, int), ou est-ce que ça peut changer ?
    • à quoi ça sert ?

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

Discussions similaires

  1. Trier dans un template avec paramètres
    Par stujava dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/02/2010, 08h03
  2. Requêtes avec paramètres optionels + TMC
    Par cfeltz dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 23/08/2007, 11h30
  3. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  4. [XSL]Valeur d'un call-template en paramètre with-param
    Par camboui dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/03/2006, 14h45
  5. [VB6]Question bête sur les paramètres optionels
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 20h33

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