Jak przekazać std::function do std::signal?

Jak przekazać std::function do std::signal?
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0

Witam.

Jak przekazać std::function<void(int)> do std::signal?
Przy próbie dostaję taki błąd:

Kopiuj
main.cpp:23:29: error: cannot convert 'std::function<void(int)>' to '__p_sig_fn_t {aka void (*)(int)}' for argument '2' to 'void (* signal(int, __p_sig_fn_t))(int)' std::signal(SIGINT, >func);

próbowałem to castować statycznie i ... reinterpret (:d), co nie dało zadowalającego mnie efektu.

Co mogę zrobić w tym przypadku?

Pozdrawiam.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
edytowany 1x, ostatnio: flowCRANE
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
0

Qt5 z C++11 connect obsługuje lambdy, więc powinno łyknąć bez kłopotu.
Podaj konkretny przykład. DAJ KOD!


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
PrezesiQ
Nie wiem czy wczytałeś się w błąd, ale chodzi mi o https://en.cppreference.com/w/cpp/utility/program/signal
MarekR22
Nie ważne, że się mylę, próbujesz być programistą, ergo zadając pytanie wskazane jest załączanie kodu, bo kod jest jednoznaczny i unika się dużo nieporozumień, tak jak to.
PrezesiQ
Ciekawy sposób na obrażanie ludzi. Nie próbuję być programistą, ponieważ nim nie jestem. Kod w tym przypadku nie jest potrzebny, ponieważ wszystko jest opisane.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
2

Nie da się, to niekompatybilne typy. Musisz przekazać funkcję bezstanową.


PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0
Kopiuj
std::function<void(int)> fun = somefunc_thatIsNotNeeded;
std::signal(SIGINT, func);

Proszę bardzo.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
edytowany 1x, ostatnio: PrezesiQ
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
1

Tak jak pisze @kq nie da się.
Jedyny sposób to zmienna globalna, która powinna być znienawidzona.
do singlal, możesz przekazać lambdę bezstanową (nie może przechwytywać zmiennych).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0

Co mi tu do kija może dać zmienna globalna?


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
0

Jest jedynym sposobem przekazania stanu do funkcji, która sama takiego nie ma.


PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0

No dobra, w takim razie czymże jest "stan" w języku C++?

PS @MarekR22 przepraszam za nerwy, trochę zmęczony jestem.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
0

Są to dane, które funkcja przechowuje.

Kopiuj
int x = 4;
function<void()> print_x = [&x]{ cout << x; };
print_x();
x = 2;
print_x();

Tutaj print_x ma stan - referencję do zewnętrznej zmiennej. W przypadku funkcji bez stanu, może ona operować wyłącznie na swoich argumentach i wartościach widocznych globalnie (czyli też zmienne statyczne/thread_local), więc powyższe nie byłoby możliwe.


MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
1

Jak piszesz o std::function to w domyśle jest to funkcja mająca stan (lamdba przechwytująca jakąś zmienną, albo std::bind).
Jeśli nie masz żadnej zmiennej powiązanej z std::function to wyczuwam problem XY.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
1

W dokumentacji jest coś takiego:

Notes

POSIX requires that signal is thread-safe, and specifies a list of async-signal-safe library functions that may be called from any signal handler.

Signal handlers are expected to have C linkage and, in general, only use the features from the common subset of C and C++. It is implementation-defined if a function with C++ linkage can be used as a signal handler.

Czyli nawet użycie lambdy bezstanowej nie jest rekomendowane (trzeba sprawdzać czy kompilator na to pozwala, zapewne zwykle zadziała). Pewność, co do działania można mieć jedynie, gdy funkcja przekazana jako argument do std::signal ma taki prototyp:

Kopiuj
extern "C" void fun(int sig);

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: hauleth

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.