Я пытаюсь использовать функцию 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 или эквивалент.