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 :

"Borne supérieure" pour un template


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    Par défaut "Borne supérieure" pour un template
    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
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    C’est une mauvaise idée.

    La raison pour laquelle les langages comme java ou c# permettent cela est d’avoir un certain nombre de garanties sur le type que tu vas utiliser, notamment que tu peux appeler certaines fonctions et que ça va marcher.

    Mais forcer une classe de base (ou une interface), ce qui est rendu nécessaire par l’implémentation des génériques de java/c#, est un frein à la réutilisabilité de ton code. Le client de ta classe générique doit pouvoir instancier ta classe générique comme il le veut, avec ce qu’il veut, du moment qu’il respecte l’interface requise.

    Pour l’instant, il n’y a rien en C++ qui permette de formaliser cette « interface requise ». La notion s’appelle « concept », mais elle est imparfaite, et pas encore intégrée à la norme.

  3. #3
    Membre habitué
    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
    Par défaut
    Je comprend ce que tu veux dire, mais je suis pas forcément d'accord.

    Si je fournis à un client une classe utilisant un template et que dans le code de la classe, je suppose que le type du template réalise une certaine interface et que j'appelle l'une des fonctions requise par cette interface, le client devrait pouvoir le savoir rien qu'avec la définition de la classe.
    Je devrais pas avoir besoin de lui dire dans la documentation ; la définition de la classe doit se suffire à elle même.

    Au même titre que l'utilisation des exceptions permet de savoir, juste avec la définition d'une méthode, les problèmes qui peuvent être rencontrés, sans être obligé (comme en C notamment) de dire dans la documentation que cette fonction renvoie NULL si il y a un problème, ou 0, ou un nombre négatif, etc ...

    Enfin après c'est une question de point de vue, et j'imagine que les deux sont valables.

    En tout cas merci pour ta réponse !

  4. #4
    Membre habitué
    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
    Par défaut
    Merci Iradrille pour ta réponse.

  5. #5
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Rafiki3931 Voir le message
    Je devrais pas avoir besoin de lui dire dans la documentation ; la définition de la classe doit se suffire à elle même.
    Tu as parfaitement raison sur ce point , actuellement C++ a un manque de ce côté-là. Mais contraindre en utilisant une classe de base est une mauvaise solution au problème. La bonne solution (les concepts) devrait arriver dans la prochaine norme.

  6. #6
    Membre habitué
    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
    Par défaut
    D'accord, merci pour ton éclairement.
    En attendant, ça ne va pas m'empêcher de coder ^^

    Merci à tous pour votre participation.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    La relation de sous-typage des templates en C++ est fondamentalement structurelle (et meme la variante la plus laxiste habituellement appelee duck-typing). Si tu veux factoriser la definition des contraintes a respecter par un parametre template, la technique idiomatique est de definir un "concept" qui decrit cette contrainte et d'y faire reference, pas d'exiger la derivation a partir d'une classe (ce qui est une forme forte de typage nominal).

    A noter que la tension entre typage structurel et nominal est en partie la raison pour laquelle il n'y a pas encore de mecanisme de concept dans le langage.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Sans doute faisable à coup de std::enable_if et std::is_convertible.

  9. #9
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Le gros avantage des templates est justement de ne pas avoir à donner d'interface comme en Java / C#.
    Et c'est en général une mauvaise idée de vouloir copier/coller des principes Java en C++ : ça marche différemment.

    Si tu connais l'interface de base, tu n'as normalement plus besoin de templates.
    Mais si tu veux quand même vérifier le type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Base {};
    struct Derived : Base {};
     
    template <class T>
    struct Foo {
    	static_assert(std::is_base_of<Base, T>::value, "wrong type");
    };
     
    Foo<int> fi; // lance une erreur de compilation
    Foo<Derived> fd; // ok

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

Discussions similaires

  1. Template - Borne supérieure
    Par Rafiki3931 dans le forum C++/CLI
    Réponses: 4
    Dernier message: 19/02/2014, 19h24
  2. [SQL] magic quotes ou double apostrophes pour échapper apostrophe
    Par zorian dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/03/2006, 16h23

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