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

Boost C++ Discussion :

vecteur vide boost::mpl


Sujet :

Boost C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut vecteur vide boost::mpl
    Bonjour à tous,

    Je me demande pourquoi cette instruction ne compile pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <boost/mpl/vector.hpp>
    #include <boost/mpl/pop_front.hpp>
    #include <boost/mpl/empty.hpp>
    #include <boost/mpl/assert.hpp>
    #include <boost/type_traits/is_same.hpp>
     
    using namespace boost::mpl;
     
    typedef vector<> empty_vector;
    typedef vector<int> int_vector;
     
    BOOST_MPL_ASSERT(( boost::is_same< empty_vector, pop_front<int_vector>::type > ));
    j'ai le message d'erreur suivant:
    1>error C2664: 'boost::mpl::assertion_failed'*: impossible de convertir le paramètre 1 de 'boost::mpl::failed ************boost::is_same<T,U>::* ***********' en 'boost::mpl::assert<false>::type'
    1> with
    1> [
    1> T=empty_vector,
    1> U=boost::mpl::pop_front_impl<boost::mpl::aux::vector_tag<1>>::apply<int_vector>::type
    1> ]
    1> Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë
    Je me serai attendu à ce que le type renvoyé par pop_front sur un vector à un type me renvoie le type vector<>

  2. #2
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Citation Envoyé par CedricMocquillon Voir le message
    Je me serai attendu à ce que le type renvoyé par pop_front sur un vector à un type me renvoie le type vector<>
    Dans le détail, vu l'implémentation de boost::mpl::vector, boost::mpl::vector<> hérite de boost::mpl::vector0 représentant une séquence vide. Alors que pop_front<int_vector>::type est un typedef sur boost::mpl::vector0. D'où l'évaluation à faux.

    Pour savoir si une séquence est vide, il existe boost::mpl::empty.

  3. #3
    Membre chevronné
    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 : 44
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Les retours des metafonctions MPL sont rarement un type direct. Donc is_same est a bannir.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    @3DArchi, j'avais vu boost::mpl::empty, en fait à la base ma question portait sur un problème de spécialisation template pour le cas liste vide (quand on déroule une liste de types) voici comment je m'en était sortis:
    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
    template<typename v, bool empty>
    struct une_fonction_impl
    {};
     
    template<typename v>
    struct une_fonction_impl<v, false>
    {
      static void apply()
      {
        //faire un truc avec front<v>::type
        typedef typename pop_front<v>::type tail;
        typedef typename empty<tail>::type empty;
        une_fonction_impl<tail, empty::value>::apply();
      }
    };
     
    template<typename v>
    struct une_fonction_impl<v, true>
    {
      static void apply()
      {
      }
    };
     
    template<typename v>
    void une_fonction()
    {
      typedef typename empty<v>::type empty;
      une_fonction_impl<v, empty::value>::apply();
    }
    Avec ton indication, je peux simplifier cette écriture par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<typename v>
    void une_fonction()
    {
      //faire un truc avec front<v>::type
      une_fonction<pop_front<v>::type>::apply();
    }
     
    template<>
    void une_fonction< vector0<> >()
    {
    }
    Ce qui est bien plus concis et proche de mon intention.
    Merci à tout les deux!

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

Discussions similaires

  1. [Boost MPL] Les integral sequence wrappers ?
    Par SalutAVous dans le forum Boost
    Réponses: 6
    Dernier message: 21/12/2012, 14h39
  2. [Débutant] Déclaration d'un vecteur vide
    Par aymenbech dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/01/2012, 09h16
  3. Réponses: 10
    Dernier message: 19/09/2011, 14h07
  4. boost::mpl? et type_traits?
    Par 3DArchi dans le forum Boost
    Réponses: 8
    Dernier message: 24/10/2008, 12h29
  5. Boost.uBlas et sous-vecteur de matrice
    Par Le Farfadet Spatial dans le forum Boost
    Réponses: 11
    Dernier message: 30/04/2008, 23h25

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