Wpis z mikrobloga

Cześć,

Robię oprogramowanie bazujące na komunikacji DBus, wykorzystując sdbus-c++ i napotkałem problem z callbackami:

W uproszczeniu program ma działać tak, że zgłaszany jest callback od DBusa, w którym odbierane są pewne dane i wywołując metodę "push" Managera mają być przekazane do kontenera.

W klasie "DBus" mam referencję na obiekt klasy "Manager". Funkcja rejestrowana jako callback musi być funkcją statyczną, stąd pytanie: jak mogę zrobić, żeby podczas wywołania tego callbacka wywołać również metodę Managera? Wiadomo, że referencja nie będzie statyczna, stąd nie można tego zrobić. Teoretycznie mógłbym zrobić statyczne metody klasy Manager, ale to się wiąże z powołaniem statycznych zmiennych, w których przechowuje dane itd.

Podejrzewam, że źle podchodzę do tematu i problem leży w źle zaplanowanej architekturze.

Trochę pseudokodu co chciałbym uzyskać:
https://pastebin.com/UyKfpT0H

#programowanie #programista15k #cpp #linux
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Parseval: jeżeli to biblioteka z C, to nie przepchasz tam bezpośrednio lambdy(C nie zna lambd, zna tylko wskaźniki do funkcji). tylko lambdy bez domknięć mogą być skonwertowane na wskaźniki do funkcji(łapanie thisa to domknięcie).

czy funkcja do rejestrowania callbacku nie przyjmuje przypadkiem wskaźnika na funkcję, który przyjmuje void* i void* jako jakieś "data"? możesz wtedy scastować this na void* i potem w wskaźniku scastować ponownie na typ thisa
  • Odpowiedz
@rethil: nie ma sensu używać std::bind. Lambda:

this{ return this->costam(msg); }

Oczywiście musisz pilnować żeby czas życia this'a się nie skończył przed wywołaniem callbacka.
  • Odpowiedz
@Parseval: Metoda registerMethod przyjmuje typ method_callback który tak naprawdę jest:

using method_callback = std::function;
Wiec możesz tam przekazać dowolny obiekt, który da się wywołać z tym parametrem, najlepiej lambdę jak kolega wyżej napisał.
  • Odpowiedz