Forum Programmation.c++ std::bind: réduire les arguments

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
13
déc.
2019

Bonjour,

J’ai un système d’interface avec une fonction contenant 2 arguments, je voudrais envoyer vers une fonction avec 1 seul argument. Je sais le faire avec une lambda, mais y a t’il une possibilité avec std::bind. Je prends l’exemple pour add et mult.

#include <iostream>
#include <functional>

int record_callback(std::function<int(int,int)> callback,int a, int b)
{
  // Real code here.
  return callback(a,b);
}

/* a+b*c */
int formule(int a, int b, int c)
{
  return a+b*c;
}

int id (int a)
{
  return a;
}

int main()
{
  // a + b * 1 == a + b
  auto add = std::bind(formule,std::placeholders::_1,std::placeholders::_2,1);
  // 0 + b * c == b * c
  auto mult = std::bind(formule,0,std::placeholders::_1,std::placeholders::_2);

  // Comment définir avec std::bind ?
  //auto add0_or_mult1 = std::bind(id,std::placeholders::_1,???);
  // Implémentation avec lambda
  auto add0_or_mult1 = [](int a, int b){return id(a);};

  int a=2;
  int b=3;

  std::cout << "add(a,b) = " << add(a,b) << std::endl;
  std::cout << "mult(a,b) = " << mult(a,b) << std::endl;
  std::cout << "add0_or_mult1(a,b) = " << add0_or_mult1(a,b) << std::endl;

  std::cout << "add(a,b) = " << record_callback(add,a,b) << std::endl;

  return 0;
}

Je n’ai finalement utilisé la fonction record_callback qu’une fois dans l’exemple. Mais voilà, je voudrais pouvoir définir add0_or_mult1 en utilisant std::bind plutôt que la lambda.

Y-a-t’il une solution ?

  • # Non, pas possible.

    Posté par  . Évalué à 3.

    Vu le nombre de réponse après 5 jours, j’en déduis que ce n’est pas possible avec std::bind et que la bonne solution est donc bien la lambda.

    Merci.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.