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 :

Restreindre paramètre template à une famille de classes


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut Restreindre paramètre template à une famille de classes
    Bonjour,

    Je travaille sur un lecteur de CSV (CSV_reader) ligne par ligne, sans analyse, où l'exploitation des données est faite à part par l'implémentation d'une interface (Row_translator).

    J'aimerais donc restreindre mon template CSV_reader aux classes dérivées de CSV_translator, afin d'appeler la méthode adaptée translate_row() à chaque lecture de ligne. Je tâtonne, et je n'arrive pas à faire taire mon compilateur.

    Une idée ? Au fait, je suis au début de la conception, si vous avez une meilleure idée pour faire ce que je veux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class CSV_reader;
    class CSV_reader::Row_translator;
     
    template <class Translator : public Row_translator>
    class CSV_reader : public CSVFile {
        std::ifstream m_csv;
     
        public:
            class Row_translator {
                public:
                    virtual void translate_row(Row const &) = 0;
            };
     
            explicit CSV_reader(std::string path) : m_csv(path.c_str()) {}
     
            void read(std::vector<Translator>&);
    };
    J'ai essayé de profiter du polymorphisme sans template, mais sans succès :/

    Merci d'avance.

    Cordialement,

    Kidpaddle2

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu doit pouvoir vérifier que le paramètre template hérite (publiquement) de la classe que tu veus avec SFINAE, ou les concepts (si tu as un compilateur qui les as ou boost qui doit en avoir).

  3. #3
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Merci de ta réponse.

    J'utilise boost effectivement, mais il n'y a rien de natif dans le langage (quelque chose dans le goût de ce que j'ai marqué) ? Aussi, qu'est-ce qui me permettrait de le faire dans boost ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    SFINAE est une technique de programmation non spécifique à boost (j'ai pas de source d'exemple en tête, il faut chercher su google :s) les concepts que propose boost sont juste plus générique (je les ai pas utilisé, mais je pense qu'ils permettent de faire ca).

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Non rien en natif dans le language, t'as boost.concept_check pour ça. Faut juste faire bien attention en définissant tes concepts..
    Ou alors plus dans l'esprit de base, tu documentes tes concepts, et tu laisses l'utilisateur se tiré une balle dans le pied si il le veut. .

    Sinon ouai SFINAE + static_assert

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Citation Envoyé par Goten Voir le message
    Ou alors plus dans l'esprit de base, tu documentes tes concepts, et tu laisses l'utilisateur se tiré une balle dans le pied si il le veut. .
    Je pense que documenter est aussi la meilleur solution, l'utilisateur est bien assez responsable pour savoir ce qu'il fait. concept ou SFINAE ca marche, mais c'est quand même assez lourd à mettre en place (surtout pour une seul classe) par rapport à une bonne doc.

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Avec boost::enable_if et boost::is_base_of, ca marche nikel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <boost/type_traits.hpp>
    #include <boost/utility/enable_if.hpp>
     
    class Base{};
    class D: public Base{}; 
     
    template <class C,class Enable=void>  class foo; //la classe générale, ne pas donner de définition permet de générer une erreur si C ne dérive pas de Base
     
    template <class C >  class foo<C,typename boost::enable_if<boost::is_base_of<Base,C> >::type>{}; //une spécialisation partielle quand C dérive de Base.
     
     
     
    int main(int argc, char const *argv[])
    {
        foo<D> f;
        //foo<int> ff; //plante
        return 0;
    }
    Edit: les concepts, c'est pour vérifier qu'une classe vérifie bien une interface donnée. Pour juste une histoire de rectriction, y'a plus léger dans boost.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    oh dear, ça m'apprendra à pas lire le sujet en entier :p, j'ai loupé cette histoire de dérivation :p.

    En effet la solution de David est la meilleure dans ce cas là.

  9. #9
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    En general:
    -enable_if pour la selection/masquage d'interface au vu de traits présent ou non
    - static_assert pour la vioaltion de pre-condition statique
    - concept_check pour la vioaltion de cocnept

    Faut toujours se poser la question de savoir si le test correspond vraiment à une selection par le traits ou une erreur.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    C++0x propose un std::enable_if, un std::is_base_of, un static_assert etc... Dispo sur Visual 2010 et gcc.
    Sinon, SFINAE est sur la F.A.Q. C++ : F.A.Q : Qu'est-ce que SFINAE ?

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 11/12/2009, 13h52
  2. Sérialisation XML d'une famille de classes
    Par darkfrag dans le forum C#
    Réponses: 3
    Dernier message: 09/06/2008, 16h21
  3. Réponses: 10
    Dernier message: 13/09/2006, 09h13
  4. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  5. Passage de paramètre d'une classe à une autre
    Par semenzato dans le forum C++
    Réponses: 3
    Dernier message: 21/09/2005, 13h59

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