Dla jednej klasy chcę przechowywać niektóre wskaźniki funkcji do funkcji składowych tej samej klasy w jednej map
przechowującej std::function
obiekty. Ale zawodzę na samym początku z tym kodem:
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
Otrzymuję error C2064: term does not evaluate to a function taking 0 arguments
w xxcallobj
połączeniu z dziwnymi błędami podczas tworzenia szablonu. Obecnie pracuję na Windows 8 z Visual Studio 2010/2011 i na Win 7 z VS10 też się nie udaje. Błąd musi wynikać z jakichś dziwnych reguł C ++, których nie przestrzegam
std::function
, z dodatkowymthis
jako pierwszym parametrem, na przykładstd::function<void(Foo*, int, int)> = &Foo::doSomethingArgs
Albo potrzebujesz
abyś mógł go wywołać w dowolnej instancji lub na przykład musisz powiązać konkretną instancję
this
źródło
this
?Jeśli chcesz zapisać funkcję składową bez instancji klasy, możesz zrobić coś takiego:
Jak wyglądałby typ pamięci bez auto ? Coś takiego:
Możesz również przekazać tę pamięć funkcji do standardowego powiązania funkcji
Poprzednie i przyszłe uwagi: istniał starszy interfejs std :: mem_func , ale od tamtej pory został uznany za przestarzały. Istnieje propozycja po C ++ 17, aby umożliwić wywoływanie wskaźnika do funkcji składowych . Byłoby to bardzo mile widziane.
źródło
std::mem_fn
został usunięty; było kilka niepotrzebnych przeciążeń. Z drugiej strony został uznany za przestarzały w C ++ 11 i zostanie usunięty z C ++ 17.std::mem_fun
template<class R, class T> unspecified mem_fn(R T::*);
i nie zniknie.Niestety, C ++ nie pozwala na bezpośrednie uzyskanie wywoływalnego obiektu odnoszącego się do obiektu i jednej z jego funkcji składowych.
&Foo::doSomething
daje „wskaźnik do funkcji składowej”, który odnosi się do funkcji składowej, ale nie do skojarzonego obiektu.Istnieją dwa sposoby obejścia tego problemu, jednym z nich jest
std::bind
powiązanie „wskaźnika do funkcji składowej” zethis
wskaźnikiem. Drugim jest użycie lambdy, która przechwytujethis
wskaźnik i wywołuje funkcję składową.Wolałbym to drugie.
Przy g ++ co najmniej powiązanie funkcji składowej z tym spowoduje, że obiekt będzie miał rozmiar trzech wskaźników, przypisanie tego do obiektu
std::function
spowoduje dynamiczną alokację pamięci.Z drugiej strony przechwytująca lambda
this
ma rozmiar tylko jednego wskaźnika, przypisanie jej dostd::function
zmiennej nie spowoduje dynamicznej alokacji pamięci za pomocą g ++.Chociaż nie zweryfikowałem tego z innymi kompilatorami, podejrzewam, że zostaną tam znalezione podobne wyniki.
źródło
Możesz użyć funktorów, jeśli chcesz mieć mniej ogólne i bardziej precyzyjne sterowanie pod maską. Przykład z moim api win32, aby przesłać wiadomość api z klasy do innej klasy.
IListener.h
Listener.h
Dispatcher.h
Zasady użytkowania
Powodzenia i dziękuję wszystkim za podzielenie się wiedzą.
źródło
Możesz tego uniknąć
std::bind
:źródło