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 :

Template, spécialiser fonction pour paramètre template


Sujet :

C++

  1. #1
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut Template, spécialiser fonction pour paramètre template
    Bonjour

    Je me heurte à une colle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template< class SRC, class DST>
    void to(const SRC& src, DST& dst);
    Pour les spécialiser, aucun souci, jusqu'à ce que SRC et DST eux-même soient class template.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<>
    void to<>(const std::vector<T>& src, Framework::Array<N>& dst);
    J'ai essayé toutes les positions imaginables sauf la bonne

    la spécialisation to<T,N> existe déjà.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  2. #2
    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
    Il faut faire une version où SRC et DST sont des templates de templates.
    Voire 4 en tout si tu envisages toutes les possibilités...

  3. #3
    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 : 34
    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
    Fait une surcharge template et pas une spécialisation template (qui ne peuvent être que totale au passage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class T, size N>
    void to(const std::vector<T>& src, Framework::Array<N>& dst);
    Après ma solution ne convient peut-être pas idéal, regardes aussi du côté des technique de tag dispatching, ça peut correspondre. L'idée est de pouvoir récupérer un type tag depuis les paramètres de ta fonction, pour ainsi pouvoir dispatcher sur la bonne fonction en utilisant des surcharges correspondants aux différents tag :
    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
    20
    21
     
    struct tag_simple {};
    struct tag_containor {};
     
    template<class T>
    struct tag_trait;
     
    template<class T>
    void foo_impl(T t, tag_simple)
    { /*...*/ }
     
    template<class T>
    void foo_impl(T t, tag_containor)
    { /*...*/ }
     
    template<class T>
    void foo(T t)
    {
      typedef typename tag_trait<T>::type tag;
      return foo_impl(t,tag());
    }
    En codant le tag_trait qui convient pour déterminer le tag en fonction du type.

    Pour un article sur le sujet, regardes sur le site de boost (faut fouiller un peu par contre :s).

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut


    Es-tu sur d'avoir besoin de donner explicitement les types de conteneurs ? Tu ne peux pas travailler directement avec les concepts et le SFINAE ?

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    template <class SRC, class DST>
    void to(const SRC& src, DST& dst) // I
    {
    }
     
    template <class SRC, class DST>
    void to(const SRC& src, DST& dst) // II
    {
        // utilise le concept de conteneur compatible STL
        // test l'existence de src.begin(), src.end(), dst.begin(), dst.end()
        using SRC::begin();
        using SRC::end();
        using DST::begin();
        using DST::end();
    }
     
    template <class SRC, class DST>
    void to(const SRC& src, DST& dst) // III
    {
        // utilise le concept de conteneur à accès aléatoire compatible STL
        // test l'existence de src.begin(), src.end(), dst.begin(), dst.end()
        // test l'existence de src[], dst[]
        using SRC::begin();
        using SRC::end();
        using DST::begin();
        using DST::end();
        using SRC::operator[] (size_type n);
        using DST::operator[] (size_type n);
    }
     
    to(vector, array); // utilisera la spécialisation III
    to(vector, list); // utilisera la spécialisation II
    to(vector, myContainer); // version générique I
    En gros, la question est : as-tu besoin d'avoir précisément les types vector et array (ce qui signifie que tu devras donner une spécialisation pour presque toutes les combinaisons possibles), ou tu as juste besoin de spécialiser la fonction en fonction des concepts utilisés ("posséder les fonctions begin et end", "posséder l'opérateur []", etc) ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bien vu gbdivers, je n'avais pas pensé à ça.
    Par contre j'ai eu l'erreur suivante
    error C2885: 'std::vector<_Ty>::operator []': not a valid using-declaration at non-class scope
    Dommage, j'aimais beaucoup le concept.

    J'ai déjà plusieurs spécialisations de types plus simples, mais ces containers voulaient pas passer (ce sont les seuls containers, ouf ).

    J'avais aussi testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class T, class N>
    void to(const std::vector<T>& src, Framework::Array<N>& dst)
    qui me renvoyait une jolie insulte à l'édition des liens: error LNK2001: unresolved external symbol.

    En déplaçant sa déclaration avant son utilisation, ça fontionne.

    Merci
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    J'espère que tu n'as pas copier mon code tout moisi
    Pour faire plus propre, il faudrait probablement utiliser des static assert, des enable_if, bref, utiliser type_traits (C++11 ou boost)

    EDIT : je viens de relire mon code... comment j'ai pu écrire un truc pareil... Aucune chance que ça fonctionne Faut que j'arrête d'écrire du code trop tôt le matin

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Oui j'y croyais au coup des using, même si je me demandais comment diable il pouvait deviner quelle fonction utiliser.

    Du coup le problème est réglé : je n'ai ni C++11 ni Boost.

    Mais le plus fou c'est la résolution : mon code fonctionnait, j'ai juste eu à le remonter d'une dizaine de lignes dans le fichier.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Moteur de template ou PHP pour les templates
    Par pierrehs dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 22/03/2011, 11h32
  2. Réponses: 32
    Dernier message: 28/11/2010, 17h33
  3. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  4. [Template] Spécialisation partielle d'un template
    Par Kurisu dans le forum Langage
    Réponses: 31
    Dernier message: 25/11/2008, 22h21
  5. Réponses: 19
    Dernier message: 18/03/2007, 16h57

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