Вы никогда не можете знать тип лямбда-функции из-за того, что логически происходит, компилятор генерирует (локальный) класс с функцией оператор вызова перегружен, а лексическое замыкание представлено членами данных этого (локального) класса. Это то, что логически происходит по лямбда-функции, такие как:
auto foo = [](int x, int y) { return x + y; };
Компилятор логически делает это:
struct CompilerGeneratedName { void operator()(int x, int y) const { return x + y; } };
CompilerGeneratedName foo;
Поскольку компилятор генерирует (локальный) класс, он генерирует имя и, следовательно, вы можете никогда явным образом не пишу тип, вы можете выводить только тип из выводов типа аргументов аргументов шаблона или с помощью auto/decltype.
Кроме того, закрытие C++ 0x статически распределено таким образом, что вы все равно не можете безопасно вернуть необработанное C++ 0x.
Все еще есть несколько способов, которыми вы можете достичь этого, первый более гибкий и поддерживает функции лямбда, которые захватывают лексические области. Используйте std :: function, если у вас есть функция лямбда, которая не захватывает что-либо из внешней области, тогда вы можете использовать указатели на функции, но это преобразование больше подходит для работы с устаревшим кодом, чем что-либо.
Поэтому в основном то, что вы хотите, это:
std::function< int (int) > foo(int x)
{
return [x](int y)->int{return x * y;};
}
Причина, почему я продолжал говорить логически, то, потому что это то, как повышение :: лямбда вид работ изначально (хотя и C++ 03 не разрешить использование локальных классов в аргументах функции шаблона), и когда идея добавления функций лямбда возникает, но поскольку это языковая функция, теперь производители компиляторов могут реализовывать ее различными и более эффективными способами, например, при захвате всей среды путем ссылки на компилятор может просто передать указатель на стек вызовов вместо логического пути, сохраняя при этом логический вид.
Спасибо, +1. Что вы подразумеваете под «если вы лямбда-функция не захватывает ничего из внешней области, то вы можете использовать указатели функций»? Разве это не захват х? – Cam
@incrediman Да, ваш пример захвачен, поэтому вы не можете использовать указатели на функции, только функции лямбда, которые не имеют состояния, могут быть преобразованы в указатели функций. –
@snk_kid: Ох. Я на самом деле просто неправильно понял, что вы написали, это имеет смысл так, как это происходит :) – Cam