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 actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    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 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 : 43
    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
    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 actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Membre actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    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 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 : 43
    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
    vu que static_cast<T>(u) fait un bon T(u) ... non

  7. #7
    Membre actif

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    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