std::binder1st, std::binder2nd
Depuis fr.cppreference.net
| Défini dans l'en-tête <functional>
|
||
template< class Fn >
class binder1st
: public std::unary_function<typename Fn::second_argument_type,
typename Fn::result_type> {
protected:
Fn op;
typename Fn::first_argument_type value;
public:
binder1st( const Fn& fn,
const typename Fn::first_argument_type& value );
typename Fn::result_type
operator()(const typename Fn::second_argument_type& x) const;
typename Fn::result_type
operator()(typename Fn::second_argument_type& x) const;
};
|
(1) | (obsolète en C++11) (supprimé en C++17) |
template< class Fn >
class binder2nd
: public std::unary_function<typename Fn::first_argument_type,
typename Fn::result_type> {
protected:
Fn op;
typename Fn::second_argument_type value;
public:
binder2nd( const Fn& fn,
const typename Fn::second_argument_type& value );
typename Fn::result_type
operator()(const typename Fn::first_argument_type& x) const;
typename Fn::result_type
operator()(typename Fn::first_argument_type& x) const;
};
|
(2) | (obsolète en C++11) (supprimé en C++17) |
Un foncteur qui lie un argument à une fonction binaire.
La valeur du paramètre est passée à l'objet au moment de sa construction et stockée dans l'objet. Lorsque le foncteur est invoqué via operator(), la valeur stockée est passée comme l'un des arguments, l'autre argument étant passé comme argument de operator(). Le foncteur résultant est une fonction unaire.
1) Lie le premier paramètre à la valeur
value donnée lors de la construction de l'objet.2) Lie le deuxième paramètre à la valeur
value donnée lors de la construction de l'objet.Exemple
Exécuter ce code
#include <cmath> #include <functional> #include <iostream> #include <vector> const double pi = std::acos(-1); // utiliser std::numbers::pi en C++20 int main() { // déprécié en C++11, supprimé en C++17 auto f1 = std::bind1st(std::multiplies<double>(), pi / 180.0); // remplacement C++11 auto f2 = [](double a) { return a * pi / 180.0; }; for (double n : {0, 30, 45, 60, 90, 180}) std::cout << n << "°\t" << std::fixed << "= " << f1(n) << " rad (using binder)\t= " << f2(n) << " rad (using lambda)\n" << std::defaultfloat; }
Sortie :
0° = 0.000000 rad (using binder) = 0.000000 rad (using lambda) 30° = 0.523599 rad (using binder) = 0.523599 rad (using lambda) 45° = 0.785398 rad (using binder) = 0.785398 rad (using lambda) 60° = 1.047198 rad (using binder) = 1.047198 rad (using lambda) 90° = 1.570796 rad (using binder) = 1.570796 rad (using lambda) 180° = 3.141593 rad (using binder) = 3.141593 rad (using lambda)
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 109 | C++98 |
operator()
ne pouvait pas modifier l'argument qui lui était passé
|
surcharges ajoutées pour gérer ce cas |
Voir aussi
|
(obsolète en C++11)
(supprimé en C++17)
|
lie un argument à une fonction binaire
(modèle de fonction) |