Анонимная функция C++

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

15
задан Dan 30 May 2012 в 12:41
поделиться