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

0

Witam.

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

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.

0

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

2

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

0
std::function<void(int)> fun = somefunc_thatIsNotNeeded;
std::signal(SIGINT, func);

Proszę bardzo.

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).

0

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

0

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

0

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

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

0

Są to dane, które funkcja przechowuje.

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.

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.

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:

extern "C" void fun(int sig);

1 użytkowników online, w tym zalogowanych: 0, gości: 1