Лямбда-выражения С++ 11, которые ничего не фиксируют, могут быть сохранены в указателе функции. Просто нужно убедиться, что лямбда принимает и возвращает те же параметры, что и указатель функции.
В библиотеке GObject все обратные вызовы имеют тип void(*GCallback) (void)
. Однако это определение никоим образом не влияет на подпись обратного вызова:
Тип, используемый для функций обратного вызова в определениях структур и сигнатурах функций. Это не означает, что все функции обратного вызова не должны принимать никаких параметров и возвращать значение void. Требуемая сигнатура функции обратного вызова определяется контекстом, в котором она используется (например, сигналом, к которому она подключена). Используйте G_CALLBACK(), чтобы привести функцию обратного вызова к GCallback.
Другими словами, можно передать функцию следующим образом:
int my_function(int a, char b) {}
путем приведения его типа (это то, что делает G_CALLBACK):
do_something(G_CALLBACK(my_function));
К сожалению, приведение типов не работает с лямбда-выражениями С++ 11:
do_something(G_CALLBACK([](int a, char b) -> int {...});
// Cannot cast from type lambda to pointer type GCallback
Можно ли вместо GCallback использовать лямбда-выражения С++ произвольного типа?
ОБНОВЛЕНИЕ
Просто чтобы уточнить, я знаю, что лямбда может быть приведена к указателю на функцию, если их подписи совпадают. Мой вопрос в другом измерении.
Стандарт ISO C гарантирует, что функция может выполняться вперед и назад без потери точности. Другими словами, справедливо одно из следующих выражений:
int f(int a){...}
void (*void_f)() = (void (*)())f;
int (*restored_f)(int) = (int (*)(int))void_f;
restored_f(10);
Мой вопрос заключается в том, допустимо ли следующее выражение в соответствии с С++ 11:
int (*f)(int) = [](int a) -> int {};
void (*void_f)() = (void (*)())f;
int (*restored_f)(int) = (int (*)(int))void_f;
restored_f(10);
auto fun = [](...){...};
), а затем выполнить явное приведение в вызовеdo_something
(do_something(reinterpret_cast<void(*)()>(fun));
). Поскольку я не пробовал, я понятия не имею, будет ли это работать или нет. - person Some programmer dude   schedule 21.02.2014