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++/CLI Discussion :

Template - Borne supérieure


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Template - Borne supérieure
    Bonjour à tous,

    Je souhaiterais utiliser un template dans une classe, mais en imposant une borne supérieure au type défini dans le template.
    Pour ceux qui connaissent le Java, on peut faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class A < B extends C > { ... };
    Cela autorise uniquement l'instanciation d'objets de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A<D> objet = new A<D>();
    avec D un type qui hérite nécessairement de C.

    Je voudrais obtenir le même comportement de borne supérieure en C++.
    Quelqu'un aurait-il une idée ? Une piste semble être l'utilisation de std::enable_if (valable avec C++11) ...

    Je vous remercie d'avance,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    "borne supérieure"
    WTF, depuis quand y-t-il une notion d'ordre dans les types dans un langage.

    Quel rapport avec le C++/CLI ?

    Avant de vous compliquer la vie, la fonctionnalité de "duck typing" des templates C++ ne vous suffit pas ?

    En C++/CLI, il existe des generics en plus des templates.
    Ces generics acceptent des contraintes de ce type mais il faut que les classes soient managées.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Je me suis effectivement trompé de forum, désolé (si le message peut être déplacé ...).

    Si on définit la loi de composition interne "hérite de", la notion d'ordre est tout à fait acceptable ... Mais c'est simplement une expression de toute manière.

    Ben justement, le duck typing autorise l'utilisation de types totalement différents à partir du moment où ils ont certaines méthodes en commun. Les deux types ne sont donc pas forcés d'hériter l'un de l'autre.

    Moi je souhaiterais que ce soit le cas. Par exemple, on pourrait vouloir créer un type de liste spécialement destinée à la gestion de véhicules. Il serait donc souhaitable ne n'autoriser que des MaListe<voiture> ou MaListe<moto> et pas des MaListe<chaise>. C'est une sorte de sécurité qui est souvent utilisée en Java, et je me demandais juste si on peut faire la même chose en C++.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Ce que vous dites n'est pas dénué de sens, cela a été fait en JAVA, dans les génériques .NET, dans des versions draft de C++11, et encore en discussion pour la C++14 (C++1y).

    Mais, actuellement, en C++11, il n'y a pas de support "direct" de cette fonctionnalité car le "duck typing" est bien plus flexible, mais aussi bien plus naturel dans la conception de templare C++, qui donne un modèle de code et non un code.
    Il faut comprendre que le caractère "variable" d'un template est le type, contrairement à la surcharge ou au dispatch dynamique, où c'est le code et non le type qui est variable.

    Votre exemple montre bien toute la puissance du "duck typing" et des template C++, car votre "MaListe" peut faire ce que vous voulez, et bien plus :
    >on pourrait vouloir créer un type de liste spécialement destinée à la gestion de véhicules
    Il suffit d'utiliser une MaListe<véhicule>, c'est fait avec 0 code supplémentaire.

    Si MaListe<véhicule> doit avoir une implémentation spéciale, il suffit d'implémenter une spécialisation de MaListe pour les véhicules.
    En plus, en cadeau Bonux, l'implémentation de cette spécialisation est complètement transparente pour le code client du template.

    >Il serait donc souhaitable ne n'autoriser que des MaListe<voiture> ou MaListe<moto> et pas des MaListe<chaise>
    Bin non, vous déclarez une MaListe<véhicule>.
    Et si une application d'ébénisterie vient à voir le jour, MaListe<chaise> sera opérationnelle.
    Mais effectivement, si Maliste doit pouvoir tourner la clé de contact de ces éléments, il faut que cela soit une MaListe<chaiseAMoteur>, mais Mr Bean en a déjà le brevet.

    L'avantage de votre approche est surtout d'expliciter plus clairement les pré-requis d'une classe.
    En C++11, il existe les types traits pour exprimer ces conditions (http://en.cppreference.com/w/cpp/types), mais de manière assez alambiquée à base spécialisations, de enable_if http://en.cppreference.com/w/cpp/types/enable_if, de is_base_of http://en.cppreference.com/w/cpp/types/is_base_of, et de version non spécialisée non compilable.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    J'ai posté le même message sur le forum C++ du coup, vous pouvez aller y présenter votre point de vue, il est tout à fait intéressant !

Discussions similaires

  1. Arbre récursif et calcul de borne supérieure
    Par zakuza dans le forum Mathématiques
    Réponses: 2
    Dernier message: 10/04/2015, 20h10
  2. "Borne supérieure" pour un template
    Par Rafiki3931 dans le forum C++
    Réponses: 22
    Dernier message: 20/02/2014, 18h56
  3. Between borne inférieure et supérieure
    Par AsQuel dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/01/2011, 16h52
  4. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31

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