Я пытаюсь использовать функцию signal(int,void(*)(int))
из <csignal>
для обработки исключения SIGFPE с плавающей запятой. Я хотел бы иметь возможность распечатать какую-нибудь полезную диагностику, кроме как только сообщение с сообщением "Исключение с плавающей запятой" или что-то в этом роде. Это означает, что функция, которую я передаю, поскольку обработчик для signal
нуждается в доступе к некоторым данным в моем коде. В этом заключается трение.
Функция должна возвращать void
и принимать только 1 параметр типа int
. Я не могу сделать обработчик функцией-членом моего класса хранения данных, так как тогда тип был бы void(Foo::*)(int)
из-за скрытого указателя this
.
Я думал об использовании lambdas, чтобы попытаться сделать анонимную функцию следующим образом:
void handler(int nSig, Foo data)
{
// do something
}
// snip
Foo data;
signal(SIGFPE, [&](int nSig)->void{handler(nSig,data);});
однако, поскольку лямбда захватывает переменную data
извне, компилятор не позволяет ей быть привязана к указателю на void(*)(int)
(что является позором, поскольку это кажется идеальным для использования лямбдами).
Я мог бы просто сделать data
глобальную переменную, которую можно было бы увидеть в handler
, но я не могу сделать это по понятным причинам.
Итак, мой вопрос: Каков наилучший способ имитации анонимных функций в С++?
Примечание. Я бы предпочел родное решение на С++ и не должен был использовать boost или эквивалент.