std::binder1st, std::binder2nd
De es.cppreference.net
| Definido en el encabezado <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) | (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 enlaza 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. Siempre que se invoca el objeto función a través de operator(), el valor almacenado se pasa como uno de los argumentos, el otro argumento se pasa como argumento de operator(). El objeto función resultante es una función unaria.
1) Enlaza el primer parámetro al valor
value dado en la construcción del objeto.2) Enlaza el segundo parámetro al valor
value dado en la construcción del objeto.Ejemplo
Ejecutar este código
#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) |