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 :

Compilation conditionnelle en fonction d'un paramètre template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Compilation conditionnelle en fonction d'un paramètre template
    Bonjour à tous

    Est-il possible de tester la présence d'une fonction ou d'un typedef dans un paramètre template et de compiler un code spécifique en conséquence ?

    Pour préciser ce que je recherche :
    Imaginons un conteneur 2D, utilisant en interne un conteneur définit dans un paramètre template (par exemple un std::vector ou un QVarLengthArray). QVarLengthArray ne fournit pas de typedef iterator ou de fonction begin(). J'aimerai donc que ma classe utilise le typedef iterator du conteneur s'il existe ou un code spécifique sinon. Ça ressemblerait à ça :

    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
    template<typename T, template <typename T> class CONT = std::vector>
    class Array2D
    {
    private:
       CONT<T> elems;
     
    public:
     
    #ifdef (CONT::iterator)
       typedef typename CONT::iterator iterator;
       iterator  begin() { return elems.begin(); }
    #elseif
       typedef T* iterator;
       iterator  begin() { return &elems[0]; }
    #endif
    };
    J'ai regardé du côté de boost::mpl mais j'ai rien vu d'intéressant (pour ce problème)

    C'est juste une question théorique, pour le moment, la solution adopté est "utiliser un conteneur valide et c'est tout"

    Merci à vous


    EDIT : pour le moment, je vois une solution en utilisant un classe template intermédiaire qui ajouterait ces fonctions manquantes. Ça serait alors de la responsabilité de l'utilisateur de penser à utiliser cette classe intermédiaire.


    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
     
    template<typename T, template <typename T> class CONT = QVarLengthArray>
    class WrapperToArray2D
    {
    public:
       typedef T* iterator;
       iterator  begin() { return &elems[0]; }
    };
     
    template<typename T, template <typename T> class CONT = std::vector>
    class Array2D
    {
    private:
       CONT<T> elems;
     
    public:
       typedef typename CONT::iterator iterator;
       iterator  begin() { return elems.begin(); }
    };
     
    Array2D<int, std::vector> array1; //ok
    Array2D<int, QVarLengthArray> array2; //erreur
    Array2D<int, WrapperToArray2D<int, QVarLengthArray> > array3; //ok
    Si quelqu'un voit une meilleure idée

  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
    Pour boost ca serait plutôt dans concept qu'il faut regarder (à la base ca génère une erreur de compilation si le type n'offre pas les prérequis, c'est le but des concepts, mais il y a peut-etre possibilité d'adapter un peu).

    Et sinon, tu peux le faire à la main en implémentant un SFINAE. Voila un exemple pour tester la présence d'un typedef nommé MyTypedef (macro pour paramétrer le nom à faire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template<class T>
    struct has_typedef
    {
      typedef char size1[1];
      typedef char size2[2];
     
      template<class U>
      static size1& test(typename U::MyTypedef *);
      template<class U>
      static size2& test(...);
     
      static const bool result = (sizeof(test<T>(NULL)) == sizeof(size1));
    };
    On peut tester différentes propiétés comme ca. Le principe c'est que quand le compila n'arrive pas à matcher l'argument dans les fonctions template, il ne produit pas d'erreur et essaie les autres fonctions.

    Ensuite en utilisant mpl (structure de contrôle en méta-prog) tu peux faire tes conditions.

    (Si tu cherches SFINAE, l'exemple courrant est la detection de fonction)

  3. #3
    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
    Merci, c'est exactement ce que je recherchais !
    A priori, ça vient du Vandevoorde. J'ai commencé à le lire donc j'aurais fini par tomber dessus... il faudrait que je le finisse, il y a plein de choses intéressantes dedans
    Pour boost, il y a enable_if à priori qui fait ça

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/07/2012, 10h20
  2. Réponses: 32
    Dernier message: 28/11/2010, 17h33
  3. Fonction avec 3 paramètre > problème de compilation
    Par arnaudperfect dans le forum C
    Réponses: 2
    Dernier message: 04/01/2008, 15h49
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  5. [CODE] Compilation conditionnelle ?
    Par Cornell dans le forum Langage
    Réponses: 3
    Dernier message: 16/09/2003, 18h16

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