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 :

X paramètres templates


Sujet :

C++

  1. #1
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut X paramètres templates
    Salut à tous,
    Alors considérons 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
    int hello&#40;int&#41; &#123; cout << "hello" << endl; &#125;
     
    template < class type_retour, class arg, type_retour&#40;&pt&#41;&#40;arg&#41; >
    class FuncPtr
    &#123;
          public&#58;
                static type_retour Exec&#40;arg a&#41; &#123; pt&#40;a&#41;; &#125;
    &#125;;
     
    int main&#40;&#41;
    &#123;
        FuncPtr<int,int,hello>&#58;&#58;Exec&#40;2&#41;;
        return 0;
    &#125;
    Il marche, cependant il ne prend en compte qu'un seul argument.
    Serait-ce possible, en utilisant Boost ou autre, de faire, par les templates, une class template pouvant prendre en compte X arguments de X types s'il le faut... Passer des ARRAY de boost en paramètre?
    Merci pour votre temps et votre attention.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    C'est possible. C'est implanté dans Loki, la bibliothèque de A. Alexandrescu.
    Je te conseille de jeter un oeil à son bouquin Modern C++ Design chez Addison &
    Wesley.
    Sa solution est un poil longue à exposer ici

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ce n'est pas possible directement. En général, deux solutions existent :

    Utiliser des typeliste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <class T1, class T2> class TypeList;
    template <class T> fct&#40;&#41;;
    fct<TypeList<T1, Typelist <T2, TypeList<T3, TypeList T4> > > &#40;&#41;;
    Après, il y a des moyens (un peu lourds, boost::mpl en encapsule la plupart) d'accèder aux données. Lire le livre d'Andrei peut être utile, mais je recommande plus pour ma part pour une approche pratique C++ template metaprogramming de Abrahams et Gurtovoy, qui explique comment utiliser boost::mpl, et à quoi le template metaprogramming peut servir dans un environnement réel.


    ou alors :

    Définir une version avec un argument, une avec 2, une avec 3....
    On peut utiliser le préprocesseur pour faire ça plus simplement (voir boost::preprocessor http://www.boost.org/libs/preprocessor/doc/index.html).

    A noter que les utilisateurs de la première solution se reposent souvent sur la seconde, afin de simplifier les écritures.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tiens, mes 2 de mes prochaines lectures, ces livres

    Tu penses à quoi en disant que seul un argument est pris en compte ?

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Hé bien juste que ce pointeur de fonction, enfin la class "l'encapsulant" ne peut être qu'un pointeur de fonction à 1 argument.
    Merci beaucoup pour vous réponses.
    J'avais entendu parler de boost.preprocessor...
    Ca donnerait quoi?
    Merci encore

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par VoidSeer
    C'est possible. C'est implanté dans Loki, la bibliothèque de A. Alexandrescu.
    Je te conseille de jeter un oeil à son bouquin Modern C++ Design chez Addison &
    Wesley.
    Sa solution est un poil longue à exposer ici
    C'est ce qu'il te faut a condition que ton compiler accepte les templates partielles (ce n'est pas le cas du MSC <= 12).

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Alp
    Hé bien juste que ce pointeur de fonction, enfin la class "l'encapsulant" ne peut être qu'un pointeur de fonction à 1 argument.
    Au fait, si c'est juste pour des pointeurs de fonction, boost::function fait ça très bien...

    Pour boost::preprocessor, j'avais posté un exemple il y a peu. Un court extrait de la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <boost/preprocessor/repetition/enum_params.hpp>
     
    BOOST_PP_ENUM_PARAMS&#40;3, class T&#41; // expands to class T0, class T1, class T2
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est pas boost::function qu'il te faut plutôt ?
    Boost ftw

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Si si, mais je tente juste d'implémenter quelque chose de semblable, mais en vite fait, juste afin de voir en profondeur comment ça se passe. Bien sûr dans mes programmes "réels" je me servirai de boost::function.
    Je vais donc voir avec BOOST_PP_ENUM_PARAMS() ...
    Merci à tous

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

Discussions similaires

  1. Problème de map avec paramètre template
    Par bouba dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2007, 13h19
  2. Limiter les types des paramètres templates?
    Par Pragmateek dans le forum C++
    Réponses: 9
    Dernier message: 29/08/2006, 13h14
  3. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 12h50
  4. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  5. Déclarer un paramètre template comme friend
    Par YéTeeh dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2006, 14h00

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