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 :

Détecter les paramètres par défaut en métaprog


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut Détecter les paramètres par défaut en métaprog
    Bonjour,

    Est-il possible de détecter si une fonction possède des paramètres par défaut en méta-programmation (je pense notamment à boost::type_traits ou boost::mpl) ?

    Merci d'avance!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ben les traits, c'est pour les classes...

    Dans quel contexte aurais-tu besoin de cette info ?

    Sinon, à part des tentatives d'instanciation, je ne vois pas...

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    quel serait l'intérêt et que souhaiterais-tu faire réellement ?
    Si une méthode attend des arguments et que tu omets d'en passer, tu auras une erreur à la compilation.
    A l'inverse si elle a des arguments par défaut, la compilation n'émettra aucune erreur.

    Donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    void f(int i = 0) { std::cout<<i<<std::endl;}
    void g(int i) { std::cout<<i<<std::endl;}
     
    int main()
    {
     f(); // ok
     f(3); // ok
     g(3); // ok
     g(); // erreur à la compilation
      return 0;
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    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
    Citation Envoyé par oodini Voir le message
    Ben les traits, c'est pour les classes...
    Non cf boost::function_traits


    Citation Envoyé par oodini Voir le message
    Sinon, à part des tentatives d'instanciation, je ne vois pas...
    Il faut que la tentative d'instanciation puisse se faire dans un contexte de substitution afin de permettre une deduction de type. Boost.Proto a un is_callable qui fait presque ca, a creuser de ce coté là.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par victor_gasgas Voir le message
    Bonjour,

    Est-il possible de détecter si une fonction possède des paramètres par défaut en méta-programmation (je pense notamment à boost::type_traits ou boost::mpl) ?

    Merci d'avance!
    Et, non, pas de manière standard. Je ne connais pas non plus d'extension compilateur qui pourrait permettre ça.

    La question que je me pose, c'est : qu'est-ce que tu souhaites faire ? Parce que j'ai l'impression que tu oublies une des fonctionnalité de base du C++ : la surcharge de fonctions. Au lieu de créer une fonction prenant 3 paramètres par défauts, tu crées 4 fonctions, chacune avec un paramètre de plus que l'autre, et hop, tu as ta différentiation.

    Mais je ne vois toujours pas l'intérêt (et je sens qu'il y en a peu, c'est al raison pour laquelle plus de background serait intéressant : ça nous permettrais de t'expliquer pourquoi tu ne devrais pas faire ce que tu souhaites faire ).

    En tout cas, ça sent fort, très fort la premature abstraction.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Joel F Voir le message
    Non cf boost::function_traits
    Boost::function_traits est une structure spécialisée par un pointeur de fonction. Le trait appartient à cette structure, pas à la fonction.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Désolé de répondre si tardivement mais voici mon contexte:
    Je suis en train de faire un interpréteur basé sur http://loulou.developpez.com/tutorie...eur3d/partie7/ mais en c++11.

    Pour l'instant voilà comment ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::string MaClasse::csv
    (
        const Date &date, 
        const Time &begin, 
        const Time &end
    )
    {
        // Code de gestion de l'export csv
    }
     
    // Dans le construteur
    std::function<std::string(const Date&, const Time&, const Time&)> csvFunction = std::bind(&MaClasse::csv, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
    m_console.registerCommand(csv, csvFunction);
    A partir de là dans l'interpréteur, si je tape csv 2-6-2012 10:00:00 12:00:00, alors cela appelle automatiquement la bonne fonction.
    Seulement j'aimerais ajouter la gestion de paramètres par défauts, mais là je sèche.

    C'est pour cela que j'aurais aimé savoir s'il été possible de détecter les params par défauts, au moins lors de l'extraction des paramètres depuis la chaîne de caractères, je me serais arrété au bon moment.

    Même si je pense que là je vais être bloqué plus par une mauvaise conception Si besoin je peux poster plus de code.

    Merci beaucoup à tous!


    EDIT: Une partie de l'extraction, j'espère que c'est assez compréhensible, au moins le principe général:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    template<typename FuncType, typename ToDo>
    struct ExecuteImpl;
     
     
    template<typename FuncType, template<typename...> class ToDo, typename ActualType, typename... ArgsAFaire>
    struct ExecuteImpl<FuncType, ToDo<ActualType, ArgsAFaire...>>
    {
       template<typename... ArgsDoneType>
        inline static std::string exec(StringExtractor& extractor, const std::function<FuncType> &function, ArgsDoneType... argsDone)
        {
            typename std::remove_const< typename std::remove_reference<ActualType>::type >::type actual;
            extractor >> actual;
     
            return ExecuteImpl<FuncType, ToDo<ArgsAFaire...> >::exec(extractor, function, argsDone..., actual);
        }
    };
     
     
    template<typename FuncType, template<typename...> class ToDo>
    struct ExecuteImpl<FuncType, ToDo<> >
    {
        template<typename... ArgsDoneType>
        inline static std::string exec(StringExtractor& extractor, const std::function<FuncType> &function, ArgsDoneType... argsDone)
            {
            extractor.throwIfEOF();
     
            return CallFunction<FuncType, typename std::function<FuncType>::result_type>::Do(function, argsDone...);
        }
    };
     
     
    // L'appel
    template<typename ResultType, typename... ArgsType>
    inline std::string ConsoleFunction<ResultType, ArgsType...>::execute
    (
        const std::string &params
    )
    {
        StringExtractor extractor(params);
     
        return priv::ExecuteImpl<ResultType(ArgsType...), ToDo<ArgsType...>>::exec(extractor, m_function);
    }

  8. #8
    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
    Citation Envoyé par oodini Voir le message
    Boost::function_traits est une structure spécialisée par un pointeur de fonction. Le trait appartient à cette structure, pas à la fonction.
    un traits EST une telle structure.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/07/2014, 08h39
  2. UDF avec les paramètres par défaut
    Par cmako dans le forum Développement
    Réponses: 8
    Dernier message: 22/06/2009, 18h18
  3. Réponses: 8
    Dernier message: 08/05/2009, 23h07
  4. Modifier les paramètres par défaut d'un port série
    Par aleister dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 06/03/2008, 17h12
  5. Restaurer les paramètres par défaut au démarrage
    Par Manu14400 dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2005, 15h21

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