Wiem, że to pytanie zostało zadane wcześniej, ale pomimo tego, że jestem dość doświadczonym programistą, nie rozumiem odpowiedzi i nie widzę sposobu, aby odpowiedzieć na te poprzednie pytania. wyjaśnienie. Nie ma linku "odpowiedź" ani nic. Poza tym te pytania były dość stare. Tak, zadaję to pytanie na nowo.Jak przeładować sygnaturę std :: function w C++
Mam klasę, w której przeciążam operatora + =. Chcę jeden przeciążenie wziąć gołe wskaźnik funkcji, a drugi do podjęcia std :: funkcję:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
Zastosowanie:
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
Niestety kod nie skompilować, ponieważ kompilator nie może określić że drugie przeciążenie nie jest odpowiednie dla pierwszego połączenia + =.
Jak zdefiniować operatora + = funkcje członka, aby rozwiązać ten problem? Nie chcę zmieniać sposobu używania operatorów (np. Za pomocą wyraźnego rzutowania). Chcę, żeby działały, jak wykazano powyżej.
Ponadto byłoby mieć pod ręką następujące przeciążenia, a także:
void operator+=(function<void()> handler);
Ale znowu, nie może spowodować przeciążenie na podstawie podpisu funkcji <> Szablon.
Zobacz ten wątek do dalszych przykładów: Isn't the template argument (the signature) of std::function part of its type? (próbowałem wdrażania różnych rozwiązań, o których mowa w tym wątku, a żaden z nich nie skompilować)
byłem programowania przez wiele lat w licznych języków, ale moje umiejętności w C++ są trochę zardzewiałe.
** duże ** pytanie brzmi: __ co zamierzasz zrobić z danym wskaźnikiem funkcji lub 'std :: function' obiektem w twoim przeciążeniu' operator + = '? __ – zaufi
@zaufi: Nie widzę jak to jest istotne, ale w porządku. Zamierzam dodać go do std :: vector funkcji obsługi zdarzeń. Zasadniczo wdrażam zdarzenia .NET w C++. Ponieważ Moce, które Nadal nie zaprzątały sobie głowy faktem, że Wydarzenia i Właściwości są - jak Zamknięcia - absolutnie niezbędną funkcjonalnością dla nowoczesnego języka programowania. –
, więc musisz mieć 'std :: vector' utworzony z' std :: function' z exacly 1 (sugeruję 'void()') podpis ... Mam rację? – zaufi