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 objet fonction qui lie un argument à une fonction binaire.
La valeur du paramètre est transmise à l'objet lors de la construction et stockée dans l'objet. Chaque fois que l'objet fonction est invoqué via
operator()
, la valeur stockée est transmise comme l'un des arguments, l'autre argument étant transmis comme argument de
operator()
. L'objet fonction résultant est une fonction unaire.
1)
Lie le premier paramètre à la valeur
value
fournie lors de la construction de l'objet.
2)
Lie le deuxième paramètre à la valeur
value
fournie lors de la construction de l'objet.
Exemple
#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)
|