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 :

static_assert et templates C++0x


Sujet :

C++

  1. #1
    Membre �clair�

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par d�faut static_assert et templates C++0x
    Bonjour, je vois l'int�r�t de static_assert (c++0x), mais je ne vois pas comment l'utiliser dans mon cas (je n'ai que trouv� l'exemple de la FAQ de c++0x sur google).

    J'ai une fonction, qui prend un pointeur de fonction membre et pointeur vers un objet (ces 2 param�tres sont templates). Puisque gcc me sort une erreur inintelligible quand on passe les mauvais arguments (on se retrouve avec un message d'erreur de 10 lignes avec plein de "instantiated from here"), je voudrais fournir un message d'erreur plus clair dans ce cas :

    Le pointeur de fonction membre est du type R(T::*)(Args...)
    L'objet est du type O.

    J'aimerais faire : static_assert(static_cast<T*>(O*), "Impossible to cast from O.type to T.type in function...");

    Sauf que static_cast veut des objets et non des types et que si je met l'objet (au lieu de O*), il dit que ce n'est pas une expression constante.
    De plus, comment afficher un O.type et T.type ? Y a t-il un moyen d'afficher le type des param�tre templates ?

    Merci � tous.

    [EDIT] Je crois qu'il me faudrait un boost::is_convertible. Y a t-il d�j� quelque chose comme sa sans utiliser boost ? Je vais regarder comment boost fait...

  2. #2
    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
    static_assert((T*)((O*)(0)), "Impossible to cast from O.type to T.type in function...");

    est une fa�on.

    boost::is_convertible utilise la SFINAE dans un contexte de surcharge d'op�rateur pour discriminer les cas.

    Pourquoi ne pas simplement utiliser boost ici ?

  3. #3
    Membre �clair�

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par d�faut
    Je dois faire une erreur car voici ce que j'ai :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    template<typename O, typename T, typename R, typename ...Args>
    inline MemberFunction1<T,R,Args...> MakeMember(O* Obj, R(T::*Func)(Args...))
    {
        static_assert(//Ligne 32
        static_cast<std::pair<double,int>*>//Ligne 33
        ((O*)(Obj)),"test");//Ligne 34
    }
    Le std::pair<double,int>* est fait pour produire l'erreur (en tant normal, ce sera juste un T*).

    Voici l'erreur que j'ai :

    error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression //Il m'indique l'erreur � la ligne 34

    et si je fait :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    static_assert(//Ligne 32
        static_cast<std::pair<double,int>*>//Ligne 33
        ((O*)),"test");//Ligne 34
    error: expected primary-expression before '*' token //Il m'indique l'erreur � la ligne 34.

    La premi�re erreur pose probl�me : T ne sera pas forc�ment un type de base.


    Pourquoi ne pas simplement utiliser boost ici ?
    J'aurais bien aim�, mais j'aurais pr�f�rer �viter une si grande d�pendance juste pour donner des messages d'erreurs plus clairs...


    De plus, y a t-il une fa�on de demander au compilateur d'afficher O.type et T.type ? (Sa permettra � l'utilisateur de ne pas aller chercher ce que sont O et T).

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    J'aurais bien aim�, mais j'aurais pr�f�rer �viter une si grande d�pendance juste pour donner des messages d'erreurs plus clairs...
    Puisque tu utilises all�grement les variadiques templates (c'est tout � ton honneur ) et autres features du C++0x je suppose que tu peux utiliser :
    std::is_convertible<>

    quant � afficher les types, le compilo le fera de toute fa�on.

  5. #5
    Membre �clair�

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par d�faut
    Merci beaucoup, je n'avais pas imagin� que la std propose is_convertible. Sa marche parfaitement.

    Juste une question sur static_cast : est-il possible que is_convertible r�ussisse et static_cast �choue ?

  6. #6
    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
    vu que static_cast<T>(u) fait un bon T(u) ... non

  7. #7
    Membre �clair�

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par d�faut
    Merci. J'avais un doute sur ce que signifiait "convertible"

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Templates] Quel syst�me utilisez-vous ? Pourquoi ?
    Par narmataru dans le forum Biblioth�ques et frameworks
    R�ponses: 270
    Dernier message: 26/03/2011, 00h15
  2. Template XHTML
    Par Sylvain James dans le forum XSL/XSLT/XPATH
    R�ponses: 14
    Dernier message: 16/06/2003, 21h45
  3. appliquer plusieurs templates
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    R�ponses: 7
    Dernier message: 04/04/2003, 16h26
  4. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    R�ponses: 4
    Dernier message: 26/03/2003, 10h52
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    R�ponses: 4
    Dernier message: 09/09/2002, 11h31

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