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 :

héritage template (en guise de typedef)


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut héritage template (en guise de typedef)
    Bonjour,
    Je sais qu'on ne peut pas faire de typedef template en C++.
    Par contre, une classe template qui hérite de la classe de base template remplit très bien ce rôle. Mais je me demande quel est-le coût de cette conception ?

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename DataType>
    class Vector : public boost::numeric::ublas::vector<DataType>
    {
    };
    Est-ce que ce choix est valable du point de vue performance ?

    Merci pour votre avis d'expert

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    En attendant les templates aliases de C++11, tu peux utiliser la technique qui consiste à mettre un typedef dans une template class:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename DataType>
    class Vector
    {
      typedef boost::numeric::ublas::vector<DataType> type;
    };
     
    typename Vector<int>::type my_vect;
    Normalement cette approche est à privilégier par rapport à la tienne sauf si le inner type est déjà une metafunction (une class template qui n'expose que des types).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut
    En effet, je connaissais cette méthode mais je ne la trouvais pas séduisante dans l'optique d'une interface.
    Merci pour la réponse.

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

    Informations professionnelles :
    Activité : aucun

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

    La bonne question à se poser, si l'on envisage l'héritage publique, c'est "puis-je *réellement* dire, du point de vue sémantique, qu'un objet de la classe dérivée (ta classe Vector) EST UN objet de la classe de base (un ublas::vector) "

    J'aurais tendance à répondre que non...

    Ta classe vector "est implémentée en terme" de ublas::vector, ou elle "est composée "d'un ublas::vector, mais, en aucun cas, elle EST UN ublas::vector.

    Il n'est donc pas cohérent de recourir à l'héritage public ici.

    De plus, il y a de fortes chances (je devrais vérifier, mais j'en suis presque sur ) que le destructeur de la classe ublas::vector ne soit pas virtuel.

    Du coup, même si, pour une raison ou une autre, tu en venais à effectivement décider de recourir à l'héritage public, tu te prépare une voie toute tracée de problèmes sans noms le jour où tu déciderais de faire passer des (référence ou pointeurs sur) Vector pour des (références ou pointeurs sur) ublas::vector.

    Ces deux raisons sont, à mon sens, amplement suffisantes pour renoncer à l'utilisation de l'héritage public qui, rappelons le, est la relation la plus forte qui puisse exister entre deux classes
    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
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En général on veut faire un typedef template pour fixer partiellement les paramètres. Là tu ne le fais pas, donc pourquoi vouloir un typedef ? Si c'est juste pour raccourcir le type, ceci suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using boost::numeric::ublas::vector;
    vector<double> v;
     
    // ou bien
     
    namespace bu = boost::numeric::ublas;
    bu::vector<double> v;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut
    Merci pour vos lumières

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

Discussions similaires

  1. template<class T> et typedef indépendant de T
    Par ababdge dans le forum C++
    Réponses: 2
    Dernier message: 03/04/2012, 02h31
  2. héritage template virtual destructeur
    Par ziker dans le forum Langage
    Réponses: 7
    Dernier message: 26/11/2011, 20h27
  3. Héritage, template et compilation
    Par Letinono dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2011, 17h47
  4. héritage template ,compilation
    Par carton99 dans le forum Débuter
    Réponses: 2
    Dernier message: 11/04/2010, 17h46
  5. Réponses: 8
    Dernier message: 18/06/2007, 15h06

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