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 :

Template et type


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut Template et type
    Suite a mon message (toujours sans reponse), je me demandais si il etait possible pour une fonction (pas une classe ...) template de limiter les types possibles.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <class T , class U> void Transform( const T &c , U &m)
    Avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CCi et CCd sont des typedefs
    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Si CCi et CCd sont des typedefs sur n'importe quoi, alors non. Si ce sont des typedefs sur des types particuliers, alors tu peux te débrouiller avec BOOST_STATIC_ASSERT et les type_traits. Si l'utilisateur instancie le template avec un type non autorisé dans l'assert, il aura une erreur de compilation.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par roulious
    Si CCi et CCd sont des typedefs sur n'importe quoi, alors non. Si ce sont des typedefs sur des types particuliers, alors tu peux te débrouiller avec BOOST_STATIC_ASSERT et les type_traits. Si l'utilisateur instancie le template avec un type non autorisé dans l'assert, il aura une erreur de compilation.
    Merci.
    Pourrais tu me donner un petit exemple ?

    Voici les typedefs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef CGAL::Cartesian<int>					CCi;
    typedef CGAL::Simple_cartesian<int>				CSCi;
    typedef CGAL::Homogeneous<int>					CHi;
    typedef CGAL::Simple_homogeneous<int>				CSHi;
    typedef CGAL::Cartesian<double>					CCd;
    typedef CGAL::Simple_cartesian<double>				CSCd;
    typedef CGAL::Homogeneous<double>				CHd;
    typedef CGAL::Simple_homogeneous<double>			CSHd;
    typedef CGAL::Exact_predicates_inexact_constructions_kernel	CEpick;
    typedef CGAL::Exact_predicates_exact_constructions_kernel	CEpeck;
    typedef CGAL::Delaunay_triangulation_2<CCd>			DTCCd;
    Merci d'avance

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class T , class U>
    typename boost::enable_if<
        boost::mpl::or_<
            boost::is_same<T, CCi>,
            boost::is_same<T, CCd>,
        >,
        void
    >::type Transform( const T &c , U &m)
    Si tu as une séquence MPL (une typelist) tu peux éventuellement rendre ça plus joli avec des méta-fonctions.

    Enfin bon, ça aurait pas été plus simple de simplement surcharger ta fonction Transform pour les deux cas ?
    En plus les conversions implicites marchent pas avec les templates, pour des raisons évidentes. Tu pourrais ici résoudre ce problème en utilisant is_convertible au lieu de is_same, puis faire la conversion au début.
    Boost ftw

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Merci, je vais voir ce que je peux faire avec ca. En fait, je n'ai pas 2 types, mais une bonne douzaine et aussi un bon nombre d'objets, d'ou l'utilite de ce que tu viens de me fournir

  6. #6
    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
    Et pourquoi vouloir limiter ?

    Si moi, utilisateur de ton code, crée un type qui ressemble suffisamment à CCi, je serais déçu de ne pas pouvoir appeler ta fonction avec...
    Utiliser des staric_assert pour valider que le type répond bien à certaines condition (présence d'une fonction membre...) me semble légitime. Les utiliser pour limiter arbitrairement le champs d'application du template me semble plus douteux.
    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.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Je suis d'accord avec toi. En fait, c'est pour veiller a ne pas faire des conversions stupides. Par exemple, ne pas passer de coordonnees en double a des coordonnee en int.
    Cela dit, ce n'est peut etre pas la bonne solution. Je ne connais pas trop ce genre de programmation, alors si tu as des conseils, je prends.

  8. #8
    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
    Je ne sais pas trop ce que fait ta fonction, mais à ta place, j'essaierai plutôt de traduire par du code ce qui est ta vraie contrainte, à savoir ces histoires de conversions de type.

    Peut-être avec l'aide de choses comme is_floating_point, is_arithmetic ou is_integral que l'on trouve dans boost::typetraits, que l'on peut associer aux static_assert.
    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.

Discussions similaires

  1. Template et type dynamique
    Par IsraGab dans le forum Langage
    Réponses: 11
    Dernier message: 23/06/2011, 14h48
  2. Réponses: 9
    Dernier message: 10/05/2010, 21h35
  3. [C++] template de type
    Par vince3320 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2007, 15h32
  4. Template et type par defaut
    Par jph_void dans le forum Langage
    Réponses: 12
    Dernier message: 01/09/2007, 16h21
  5. Templates et Types.
    Par ousta dans le forum C++
    Réponses: 4
    Dernier message: 30/11/2005, 20h14

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