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)
|
(obsoleto en C++11)
(eliminado 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)
|
(obsoleto en C++11)
(eliminado en C++17)
|
|
|
|
|
Un objeto función que vincula un argumento a una función binaria.
El valor del parámetro se pasa al objeto en el momento de la construcción y se almacena dentro del objeto. Cada vez que se invoca el objeto función mediante
operator()
, el valor almacenado se pasa como uno de los argumentos, mientras que el otro argumento se pasa como argumento de
operator()
. El objeto función resultante es una función unaria.
1)
Vincula el primer parámetro al valor
value
proporcionado durante la construcción del objeto.
2)
Enlaza el segundo parámetro al valor
value
proporcionado durante la construcción del objeto.
Ejemplo
#include <cmath>
#include <functional>
#include <iostream>
#include <vector>
const double pi = std::acos(-1); // usar std::numbers::pi en C++20
int main()
{
// obsoleto en C++11, eliminado en C++17
auto f1 = std::bind1st(std::multiplies<double>(), pi / 180.0);
// reemplazo en 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 (usando binder)\t= "
<< f2(n) << " rad (usando lambda)\n"
<< std::defaultfloat;
}
Salida:
0° = 0.000000 rad (usando binder) = 0.000000 rad (usando lambda)
30° = 0.523599 rad (usando binder) = 0.523599 rad (usando lambda)
45° = 0.785398 rad (usando binder) = 0.785398 rad (usando lambda)
60° = 1.047198 rad (usando binder) = 1.047198 rad (usando lambda)
90° = 1.570796 rad (usando binder) = 1.570796 rad (usando lambda)
180° = 3.141593 rad (usando binder) = 3.141593 rad (usando lambda)
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
|
DR
|
Aplicado a
|
Comportamiento publicado
|
Comportamiento correcto
|
|
LWG 109
|
C++98
|
operator()
no podía modificar el argumento pasado
|
se añadieron sobrecargas para manejar esto
|
Véase también
(obsoleto en C++11)
(eliminado en C++17)
|
vincula un argumento a una función binaria
(plantilla de función)
|