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