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 :

Alias/raccourci pour appeler une lambda avec un paramètre en dur


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Alias/raccourci pour appeler une lambda avec un paramètre en dur
    Bonjour,
    J'ai eu du mal à trouver un titre qui soit clair, toute proposition est bienvenue.

    J'ai une procédure qui doit remplir un objet plusieurs fois de la même façon avec seulement quelques paramètres variables. Pour cela j'ai créé une lambda car ça me semblait bien de rester dans la portée de ma procédure. J'ai ensuite réalisé qu'un des paramètres n'avait toujours que 2 valeurs possibles, et qu'il est assez long à écrire (enum avec namespace) et que j'aimerais bien avoir un "raccourci" pour ces deux appels possibles à ma lambda. J'ai donc créé deux autres lambdas nommées plus explicitement et qui passe chacune une valeur possible. Elles prennent donc 1 paramètre de moins et le code est plus épuré.

    Voici un exemple minimaliste :

    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
    #include <vector>
     
    class Truc
    {
    public:
        int a;
        int b;
    };
     
    int main(int argc, char *argv[])
    {
        auto emplir = [] (int argA, int argB)
        {
            Truc truc;
            truc.a = argA;
            truc.b = argB;
            return truc;
        };
     
        auto emplir1 = [emplir] (int argB)
        {
            return emplir(1, argB);
        };
        auto emplir2 = [emplir] (int argB)
        {
            return emplir(2, argB);
        };
     
        std::vector<Truc> trucs;
        trucs.push_back(emplir1(10)); // au lieu de emplir(1, 10)
        trucs.push_back(emplir2(20));
     
        return 0;
    }
    Dans l'exemple ça n'a pas trop de sens, mais dans mon code la procédure pour créer un truc est plus longue et prend plus de paramètres, l'argument que je "raccourcis" est également bien plus verbeux qu'un simple int argA.

    Ma question : y a-t-il une façon plus simple/propre de créer ce genre de raccourci (un genre d'alias qui passerait en dur le 1er argument) que par des lambdas ? J'ai écarté les macros car il me semble que garder ces fonctions dans la portée locale évite le risque de conflits dans le reste du projet, mais c'est peut être une erreur ?

  2. #2
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 470
    Points : 6 107
    Points
    6 107
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    J'ai ensuite réalisé qu'un des paramètres n'avait toujours que 2 valeurs possibles, et qu'il est assez long à écrire (enum avec namespace) et que j'aimerais bien avoir un "raccourci" pour ces deux appels possibles à ma lambda. J'ai donc créé deux autres lambdas nommées plus explicitement et qui passe chacune une valeur possible. Elles prennent donc 1 paramètre de moins et le code est plus épuré.
    Dans ce cas, au lieu de créer deux nouvelles lamdba, je pense que le plus simple serait de créer deux variables avec un nom court qui contiennent tes deux valeurs longues à écrire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const auto p1 = exemple_de_namepace::VALEUR_AVEC_UN_NOM_LONG;
    const auto p2 = exemple_de_namepace::VALEUR_AVEC_UN_NOM_TRES_LONG_QU_ON_NE_VEUT_PAS_REECRIRE;
    // Dans la suite du code, manipuler directement p1 et p2.

  3. #3
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je n'y avais même pas pensé, merci !
    Dans mon cas il ne s'agissait pas de valeurs mais d'objets globaux constants à passer en paramètre, donc plutôt qu'une copie j'ai fait une référence.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/11/2012, 18h14
  2. [AC-2003] Comment appeler une fonction avec deux paramètres. Erreur '=' attendu
    Par nirG95 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/09/2009, 10h53
  3. Expression regulière pour relever une URL avec ses paramètres
    Par Immobilis dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2008, 16h52
  4. Raccourci clavier pour appeler une procedure
    Par KOUTO dans le forum Delphi
    Réponses: 2
    Dernier message: 09/06/2007, 17h20

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