¿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 <>
Respuesta
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.
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;
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)
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));
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.
No se puede hacer, simplemente. std::function
(en todas sus iteraciones, incluidas boost::function
y std::tr1::function
) no es compatible con operator==
.
- 1. Ordenar un std :: vector <std :: pair <std :: string, bool >> por la cadena?
- 2. std :: vector <std::string> crash
- 3. Sobrecarga en std :: función <...>
- 4. std :: array <T> inicialización
- 5. vector de std :: función <>
- 6. Diferencia entre std :: function <> y un puntero de función estándar?
- 7. ¿Por qué std :: sub_match <T> hereda públicamente de std :: pair <T, T>?
- 8. Cómo "fundido" un std :: vector <char> std :: vector <wchar_t>
- 9. std :: lista <std :: unique_ptr <T>>: que pasa a su alrededor
- 10. std :: cin.ignore (std :: numeric_limits <std :: streamsize> :: max(), '\ n') de error al utilizar # include <Windows.h>
- 11. std :: array <char, N> std :: string
- 12. Convierte std :: string en std :: vector <char>
- 13. ¿Debería std :: reference_wrapper contener el operador de comparación predeterminado "<"?
- 14. Cómo guardar `std :: vector <uchar>` en `std :: ostream`?
- 15. const std :: map <boost :: tuples :: tuple, std :: string>?
- 16. ¿Está std :: list <> :: sort stable?
- 17. std :: bind a bound function
- 18. std: numeric_limits <double> :: epsilon definition
- 19. Principios de diseño detrás de std :: ratio <>
- 20. Cuál es la diferencia entre std :: multimap <key, value> y std :: map <key, std :: set <value>>
- 21. "Fatal error: No se puede redeclare <function>"
- 22. Reglas para determinar el conjunto de tipos de funciones compatibles con std :: function <R(T1,T2)>?
- 23. ¿Cómo resuelvo este error de <tipo de función sobrecarga no resuelta> cuando uso std :: function?
- 24. ¿Cómo hacer comparación de valores entre dos Dictionary <string, lista <string>> objetos
- 25. C# HashSet <T> rendimiento de búsqueda (en comparación con un ObservableCollection <T>)?
- 26. Fuga de memoria con std :: cadena al usar std :: list <std::string>
- 27. 'std :: vector <T> :: iterator it;' no compila
- 28. En la declaración "std :: vector <X> f();", ¿es "std :: vector <X>" una instanciación?
- 29. Convierte un std :: vector <std :: vector <double>> representa una matriz 2D a cv :: Mat
- 30. ¿Hay alguna diferencia entre std :: map <int, int> y std :: map <const int, int>?
@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
@DeadMG: suficiente, pero dup de [Comparación de std :: tr1 :: función <> objetos] (http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects), luego –
@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