c++ c++11 stdbind

c++ - ¿Por qué los objetos devueltos desde bind ignoran argumentos adicionales?



c++11 stdbind (1)

Ignorar argumentos adicionales es mucho más sencillo de implementar, y en realidad puede ser útil.

En una implementación típica, por ejemplo, libstdc ++ (g ++), el enfoque adoptado es recopilar los argumentos de operator() en una tupla y luego dejar que los argumentos de enlace std::placeholder extraigan según sea necesario. Hacer cumplir el recuento de argumentos requeriría contar el número de marcadores de posición utilizados, lo que sería bastante complicado. Tenga en cuenta que el vinculable puede ser un functor con patrones de llamada de operator() múltiples o con plantilla, por lo que el operator() objeto de operator() no se puede generar con una única firma "correcta".

También tenga en cuenta que puede escribir:

std::bind(&foo, std::placeholders::_1, std::placeholders::_3);

es decir, ignorando explícitamente el segundo argumento del objeto de enlace. Si bind aplicó su cuenta de argumentos, necesitaría una forma adicional de especificar que, por ejemplo, también se ignoraría un cuarto argumento.

En cuanto a la utilidad, considere vincular un controlador de señales miembro a una señal:

sig.connect(std::bind(&C::on_sig, this, param, std::placeholders::_1));

Si sig tiene parámetros de emisión no deseados, el objeto de bind simplemente los ignora; de lo contrario, vincular el mismo controlador a varias señales requeriría escribir múltiples envoltorios de reenvío sin ningún propósito real.

Supongamos que tengo una función que toma dos argumentos,

void f(int x, int y);

Y quiero atar a uno de ellos. Puedo usar std::bind como sigue:

auto partiallyBoundF = std::bind(f, 10, _1);

partiallyBoundF toma solo un argumento, pero puedo llamarlo con más de uno. Los argumentos más allá del primero ni siquiera tienen que ser de un tipo que tenga sentido:

partiallyBoundF(20, 0); partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});

¿Cuál es el propósito de permitir que los objetos devueltos desde el bind se pasen argumentos adicionales? Permite la compilación de errores de llamada que serían rechazados en cualquier otro lugar.