2011-05-01 11 views
6

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 <>

+2

@ 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

+0

@DeadMG: Wystarczająco, ale dup z [Porównując std :: tr1 :: function <> objects] (http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects), następnie –

+0

@mmutz: They ' jestem blisko, ale nadal nie zadzwonię do dupe. Biblioteki TR1 mogą mieć inną specyfikację niż biblioteki C++ 0x. – Puppy

Odpowiedz

3

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.

std::vector of std::function

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; 
  1. 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) 
    
  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)); 
    
  3. 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.

7

Nie można tego zrobić, po prostu. std::function (we wszystkich iteracjach, w tym boost::function i std::tr1::function) nie obsługuje operator==.