2011-05-01 10 views
6

¿Es posible comparar de algún modo dos objetos std::tr1::function<>? ¿Qué ocurre si tengo una colección de objetos function<void(int,float)> y quiero agregar y eliminar controladores de eventos? Agregar es trivial, pero encontrar el que se va a eliminar parece ser imposible.Comparación de std :: function <>

+2

@James: No estoy de acuerdo. La pregunta no pregunta por qué no es así, sino que pregunta si lo es. Si quieres encontrar esa pregunta, debes saber que no es así. – Puppy

+0

@DeadMG: suficiente, pero dup de [Comparación de std :: tr1 :: función <> objetos] (http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects), luego –

+0

@mmutz: They ' Estoy cerca, pero todavía no voy a llamar a Dupe. Las librerías TR1 pueden tener una especificación diferente a las librerías C++ 0x. – Puppy

Respuesta

3

Según la información del Desbordamiento de pila en el siguiente enlace, ES POSIBLE pero solo si ajusta el objeto std :: function en su propia clase.

std::vector of std::function

Mediante el uso de una clase contenedora, se puede comprobar si dos punteros de función std :: envueltos son iguales, pero eso no te dice nada acerca de lo que el std :: función envuelve. Por lo tanto, cambiar su diseño es probablemente un mejor enfoque.

corregir: Volví para mostrar la manera que he resuelto un problema muy similar.

0) Typedefs para la concisión.

using std::placeholders; 
    typedef std::function < void (int, float) > some_func; 
    typedef std::pair < intptr_t, intptr_t > method_hash; 
  1. Escribe tu colección de objetos std :: función de punteros a funciones o métodos de unión. Donde está haciendo esto para funciones estáticas, omita some_object_ptr.

    some_func some_method (std::bind (some_method_ptr, 
                some_object_ptr, _1, _2) 
    
  2. uso std :: reinterpret_cast < intptr_t> para crear un hash único para su función, y usarlo con std :: pair para hacerlo por métodos.

    method_hash pairID (reinterpret_cast <intptr_t> (some_object_ptr), 
             reinterpret_cast <intptr_t> (some_method_ptr)); 
    
  3. Ahora su Id de Par se puede almacenar en un vector u otro recipiente/matriz. Solo asegúrate de mantener que los índices están alineados para que un hash siempre se corresponda con el objeto std :: function correcto, y luego puedes usar find() para obtener un iterador en su posición y distancia() para convertir el iterador al índice requerido.

Tenga en cuenta que esto tendrá que hacerse cada vez que se genere su contenedor. Dado que está basado en punteros, los hashes cambiarán en diferentes ejecuciones de su programa.

7

No se puede hacer, simplemente. std::function (en todas sus iteraciones, incluidas boost::function y std::tr1::function) no es compatible con operator==.

Cuestiones relacionadas