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 :

constexpr et exceptions


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut constexpr et exceptions
    Bonjour.

    Je découvre le monde merveilleux des constexpr de C++ 2011 et j'avais une petite question avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline constexpr unsigned long long int metaFactorial(const unsigned char n) 
    {
        return (((n > 0) && (n < 21)) ? (n*metaFactorial(n-1)) : (1));
    }
    Au lieu de renvoyer 1 quand n >= 21, j'aimerai que le code plante par exemple en lançant une exception standard (d'ailleurs question au passage pour quelqu'un qui découvre la gestion des erreurs : quelle est l'exception standard la plus adaptée dans ce cas, est-ce "domain_error"). Comment faire cela ?

    Merci beaucoup.

  2. #2
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Tu peux jeter une exception avec par exemple return n > 20 ? throw [exception] : [...]. (au début je croyais que c'était impossible, mais selon 7.5.1§5 ...)
    Je pense que domain_error est une bonne idée d'exception. Par contre, je ne sais pas si il sera possible de la jeter, étant donné que 19.2.2 ne l'indique pas comme ayant un constexpr constructor ... A voir !

    Sinon, tu as fait du lisp ? Presque toutes ces parenthèses sont inutiles, il suffirait de mettre return n > 0 && n < 21 ? n*metaFactorial(n-1) : 1; (ce que je trouve au passage plus compréhensible).

  3. #3
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Je ne comprends pas bien comment on peut lancer une exception dans une constexpr, puisque le principe est justement que ça soit executé à la compilation....

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 151
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Je vais peut être dire une bêtise, mais n'y a t-il pas des assertions contrôlées à la compilation.
    Sinon, nous avons de bons tutoriels sur la méta-programmation : http://cpp.developpez.com/cours/?page=general#avances
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Je ne comprends pas bien comment on peut lancer une exception dans une constexpr, puisque le principe est justement que ça soit executé à la compilation....
    Je suppose que c'est rapporté comme une erreur de compilation ? (pour ma référence, 7.5.1§5 de la dernière norme pré-c++11 -- non, je ne vais pas me payer le standard alors qu'on a quasiment identique mais gratuit à côté)

    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Je vais peut être dire une bêtise, mais n'y a t-il pas des assertions contrôlées à la compilation.
    Sinon, nous avons de bons tutoriels sur la méta-programmation : http://cpp.developpez.com/cours/?page=general#avances
    Il me semble que l'OP parle de constexpr, ce qui n'est pas de la métaprog'.
    Ou bien j'ai mal compris ce message ?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 151
    Billets dans le blog
    150
    Par défaut
    Ah ... donc ce sont deux choses fondamentalement différentes.

    puisque le principe est justement que ça soit executé à la compilation....
    Cela m'a mit dans l'erreur

    Qu'est ce que le contexpr du coup ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    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
    Il est indiqué dans n2235 que les throw expression ne sont pas valide avec constexpr. Donc pas d'exception avec constexpr (ce qui est logique, constexpr est évaluer à la compilation alors que les exceptions sont évaluer à l'exécution)
    Peut être en utilisant les static_assert ?

    Sinon, utiliser les templates mais si c'est un exo pour apprendre constexpr, c'est pas une solution...

    Qu'est ce que le contexpr du coup ?
    Une nouvelle fonctionnalité du C++11. Je prépare une mise à jour de mon post du C++11 pour en parler.

  8. #8
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    LittleWhite> Ce sont des fonctions, qui sont indiquées au compilateur comme étant potentiellement évaluables à la compilation. En gros, constexpr indique que la fonction est pure, comme le disent les langages fonctionnels.

    gbdivers> n3242-7.1.5§5 donne un exemple du contraire : throw *est* utilisable avec constexpr. (mea culpa pour les références précédentes : j'avais inversé le 1 et le 5)

  9. #9
    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
    ouch, j'avais regardé dans n2235 (le draft donné en indication dans gcc C++11), ça date un peu beaucoup. Merci de la rectification

Discussions similaires

  1. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  2. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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