[C++11] Гарри Поттер и Возвращение Лямбды
auto generateFun(const QString &search, const QString &replacement)->std::function<QString(const QString &)>
а полностью автоматическое auto для возвращаемого типа вроде убрали
а объясните мне популярно, как такое может в с++ работать? ссылки на search и replacement ведь могут стать невалидными после вызова generateFun, но до вызова того что она вернет.
Вот если бы вместо этого было [&], то да, был бы выстрел в ногу
Ха, так сработало, о std::function я не подумал, спасибо. Полностью полноценные функции правда получить не получается: если воткнуть в возвращаемую функцию static переменную, то при создании новых функций (после первой созданной) она не инициализируется, видимо, считается одной общей на все функции.
так сработалоДобавив, по всей видимости, виртуальный вызов.
#include <iostream>
auto l1 = [] (int i) {
return [=](int j) { return i * j;};
};
int main {
auto mul2 = l1(2);
auto mul10 = l1(10);
std::cout << mul2(5) << " " << mul10(5) << std::endl;
}
Оставить комментарий
doublemother
Возникло у меня желание, как и во всяких модных языках, динамически генерить функцию. Классическое решение проблемы, путём использования функционала, не так интересно, я захотел сделать примерно так:Вышеупомянутый код не заработает по той простой причине, что сказать "auto" я не могу — для функции я таки обязан указать возвращаемый тип, который ни указать, ни вывести при помощи decltype я не могу.
GCC возвращаемое значение при компиляции обзывает: 'generateFun(const QString&, const QString&)::<lambda(const QString&)>', но и такую конструкцию, очевидно, нельзя указать в качестве возвращаемого значения.
Отсюда вопрос: как можно таки вернуть лямбду?