2012-04-14 15 views
6

¿Alguien puede recomendar algunos buenos usos prácticos de mem_fn de tr1 y vincular utilidades? No necesito C++ esotérico para el desarrollo de la biblioteca. solo algunos códigos de nivel de aplicación que hacen uso de estos.algunos usos prácticos de mem_fn & bind

cualquier ayuda será muy apreciada.

Respuesta

5

Normalmente puede ser bastante complicado usar las funciones de los miembros para las devoluciones de llamadas, por ejemplo, para usar en las funciones <algorithm>. std::mem_fn (se ha estandarizado ahora, por lo que ya no debería necesitar usar el espacio de nombres tr1) crea un objeto invocable que se puede usar como el objeto de functor de esas funciones. Para ver un ejemplo de su uso, consulte la sección de ejemplos de this link que usa std::string::size.

std::bind se pueden utilizar cuando, p. no conoce los argumentos reales en tiempo de compilación, pero tiene que crear un objeto invocable con argumentos en tiempo de ejecución. También se puede utilizar para cambiar el orden de los argumentos, ejemplo:

auto f1 = std::bind(printf, _2, _1); 
f1(42, "%d\n"); 

(Vale, ejemplo tonto, pero lo único que podía pensar ahora mismo.)

5

he utilizado std::mem_fn y std::bind para el alojamiento de estilo reflexión.

Así que tendría un class SomeClass con un vector de AbstractProperty. No puede haber varios tipos diferentes de clases de AbstractProperty, como PropertyFloat, PropertyU32, etc.

Luego, en SomeClass lo haré bind a un std::function para AbstractProperty. Me bind haciendo

std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this) 

Para una función de tipo de organismo, me gustaría utilizar

std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1) 

Por supuesto, para ajustar las funciones de la clase es más difícil, pero sí utilizar un std::function hacer asi que. En PropertyFloat tengo

typedef std::function<float(void)> GetterType; 

Así que puse a través de una función, me paso la primera std::bind me presenté como el parámetro para

typename PropertyFloat::GetterType getter 

Por supuesto, los tipos podrían hacer uso de plantillas y ser más genérico, pero eso es una compensación según lo que está desarrollando.

+0

+1. Ese es el tipo de cosas que quiero probar también. ¿Tiene más detalles para compartir sobre cómo se hizo el bit de reflexión? – Fanatic23

+0

Hmm, esto fue básicamente lo máximo que pude describir sin probablemente poner toda la base de código en github o algo así (y el código es de fuente cerrada). Actualicé mi publicación para proporcionar más detalles. Desafortunadamente, no hay mucha documentación para el tipo de sistema que desarrollé aquí. Estoy en el proceso de escribir un documento grande en todo el sistema, pero todavía no está terminado. Puedo decir que he estado usando 'std :: mem_fn' y' std :: bind' para este tipo de cosas durante casi dos años, sin problemas. – josephthomas

+0

También no, que este es uno de los usos más complejos de 'mem_fn' y' bind' que yo sepa. Si buscas practicar con los dos tipos, tal vez deberías considerar algunos pequeños usos de ellos (lo hice al principio antes de desarrollar este sistema). Este sistema de reflexión se basa en el uso de estos dos tipos (y 'std :: function'). Aunque honestamente, esto puede ser simplemente reemplazado con punteros de función de miembro (en teoría). Ambos tienen sus ventajas y desventajas. – josephthomas

3

El código siguiente cuenta el número de elementos mayores de cinco:

#include <functional> 
#include <algorithm> 
#include <vector> 
#include <iostream> 

int main() { 
    using namespace std; 
    vector<int> v { 1, 5, 2, 7, 6, 7, 5 }; 
    cout << count_if(v.begin(), v.end(), 
        bind(greater<int>(), placeholders::_1, 5)) << endl; 
} 
+0

¿Por qué debería obligar a ser una mejor opción que una función lambda en este ejemplo? –

Cuestiones relacionadas