• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki do metod

Object Storage Arubacloud
0 głosów
777 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez VirtualMember Pasjonat (15,790 p.)

Witam, powiedzmy, że mam taki kod:

 

class Foo
{
    void a(int arg){ /*do sth*/}
}

int main()
{
std::vector <  void(*)() > keyData;

//Próba dodania

return 0;
}

 

Jak dodać wskaźnik do metody do tego wektora wyżej?

2 odpowiedzi

+3 głosów
odpowiedź 4 kwietnia 2017 przez j23 Mędrzec (194,920 p.)
std::vector <  void(Foo::*)(int) > keyData;

...
keyData.push_back(Foo::a);

Zastanowiłbym się nad użyciem obiektów funkcyjnych std::function.

komentarz 6 kwietnia 2017 przez VirtualMember Pasjonat (15,790 p.)
a jak zrobić by to było dla wszystkich klas a nie tylko foo?
+2 głosów
odpowiedź 4 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

Wskaźniki do metod w klasie są bardzo niewygodne w stosowaniu. Przychylam się do rady @j23. Warto zmienić je na obiekty funkcyjne:

#include <functional>
#include <vector>
#include <iostream>

class Foo
{
public:
    void a(int) { /*do sth*/}
};

void fooFun(int) { }

int main()
{
    std::vector <std::function<void(int)>> keyData;
    auto f = Foo();
    auto f1 = std::bind(&Foo::a, &f, std::placeholders::_1);
    keyData.push_back(f1);
    keyData.push_back(fooFun);
    keyData.push_back([](int) {});
}

 

komentarz 4 kwietnia 2017 przez VirtualMember Pasjonat (15,790 p.)

Robię coś takiego w argumencie:

std::bind(&Scene::moveViewTop, Scene::getInstance(), std::placeholders::_1);

gdzie Scene::getInstance zwraca &Scene

i wyskakuje ten błąd:

       no suitable user-defined conversion from "std::_Binder<std::_Unforced, void (mv::Scene::*)(), mv::Scene &, const std::_Ph<1> &>" to "std::function<void ()>" exists  

komentarz 4 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
Ej.. a jak wygląda sygnatura metody moveViewTop(...) ? Zwróć uwagę że w przykładzie który podałem sygnaturą była funkcja "zwracająca void i przyjmująca 1 int". Stąd std::function<void(int)> w kontenerze.

Drugie pytanie (bo nie widzę kodu więc pytam), ile argumentów przyjmuje moveViewTop(...)? Przez 1 std::placeholders::_1 podałeś że 1 a sygnatura docelowej funkcji to... void() jak widzę z komunikatu błędu. To ma się zgadzać. Inaczej się nie skompiluje. function<COŚ> to obiekt "wołalny". Może nim być i funkcja i metoda w klasie i... cokolwiek co posiada daną sygnaturę.
komentarz 5 kwietnia 2017 przez VirtualMember Pasjonat (15,790 p.)
void moveViewTop(); - to jest sygnatura tej metody, akurat w tym przypadku nie przyjmuje żadnych argumentów
komentarz 5 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)

No to po co placeholder? Wystarczy:

std::bind(&Scene::moveViewTop, Scene::getInstance());

 

komentarz 5 kwietnia 2017 przez VirtualMember Pasjonat (15,790 p.)
gdy tak robię to wyrzuca mi ten błąd:

Error    C2665    'std::tuple<Scene>::tuple': none of the 2 overloads could convert all the argument types
komentarz 5 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
C++ ma zasadę że nie może wykonać 2 konwersji z typu na typ.. widzę że bind sobie może nie porazić. Spróbuj lambdą.

Podobne pytania

0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 23 października 2019 w JavaScript przez Hasira Bywalec (2,100 p.)
+1 głos
2 odpowiedzi 137 wizyt
0 głosów
2 odpowiedzi 183 wizyt

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...