Czy można w jakiś sposób porównać dwa obiekty: std::tr1::function<>
? Co jeśli mam kolekcję obiektów function<void(int,float)>
i chcę dodać i usunąć programy do obsługi zdarzeń? Dodawanie jest banalne, ale znalezienie tego, które ma zostać usunięte, wydaje się niemożliwe.Porównywanie std :: function <>
Odpowiedz
Na podstawie informacji z przepełnienia stosu na poniższym łączu jest to możliwe, ale tylko wtedy, gdy obiekt obiektu std :: zostanie zawinięty we własnej klasie.
Korzystając klasy otoki, można sprawdzić, czy dwie owinięte wskaźniki std :: funkcyjne są równe, ale nie mówi nic o tym, co std :: funkcja okłady. Zatem zmiana projektu jest prawdopodobnie lepszym podejściem.
edytuj: Wróciłem, aby pokazać, w jaki sposób rozwiązałem bardzo podobny problem.
0) Wpisano w celu zwięzłości.
using std::placeholders;
typedef std::function < void (int, float) > some_func;
typedef std::pair < intptr_t, intptr_t > method_hash;
Napisz swoją kolekcję obiektów std :: funkcyjnych poprzez wiązanie wskaźniki do metod lub funkcji. Tam, gdzie robisz to dla funkcji statycznych, pomiń some_object_ptr.
some_func some_method (std::bind (some_method_ptr, some_object_ptr, _1, _2)
użycie std :: reinterpret_cast < intptr_t>, aby stworzyć unikalny hash dla funkcji i używać go z std :: pair do tego metod.
method_hash pairID (reinterpret_cast <intptr_t> (some_object_ptr), reinterpret_cast <intptr_t> (some_method_ptr));
Teraz twój pairID mogą być przechowywane w wektorze lub innego pojemnika/tablicy. Po prostu pamiętaj, aby upewnić się, że indeksy są wyrównane, tak aby wartość skrótu zawsze odpowiadała poprawnemu obiektowi std :: function, a następnie można użyć find(), aby uzyskać iterator do jego położenia i odległości(), aby przekonwertować iterator na wymagany indeks.
Pamiętaj, że będzie to konieczne przy każdym generowaniu kontenera. Ponieważ jest on oparty na wskaźnikach, skróty zmienią się w różnych przebiegach twojego programu.
Nie można tego zrobić, po prostu. std::function
(we wszystkich iteracjach, w tym boost::function
i std::tr1::function
) nie obsługuje operator==
.
@ James: Nie zgadzam się. Pytanie nie pyta, dlaczego tak nie jest, pyta, czy tak jest. Jeśli chcesz znaleźć to pytanie, musisz już wiedzieć, że tak nie jest. – Puppy
@DeadMG: Wystarczająco, ale dup z [Porównując std :: tr1 :: function <> objects] (http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects), następnie –
@mmutz: They ' jestem blisko, ale nadal nie zadzwonię do dupe. Biblioteki TR1 mogą mieć inną specyfikację niż biblioteki C++ 0x. – Puppy