Вы просто полностью упускаете суть.Потребность в std::function
очень и очень очевидна.
- Все лямбды имеют уникальный тип во время компиляции
- Вы хотите, чтобы вектор содержал любой функциональный объект во время выполнения.
- Следовательно, требуется какое-то стирание типа, что и делает работа
std::function
.
Как же вообще можно создать вектор, который изменяется во время выполнения?факт времени компиляции, как тип, содержащийся в нем?Это просто логически невозможно - если вы не используете абстракцию, такую как std::function
.
Конечно, если вам нужен только один лямбда-тип внутри, тогда вам вообще не нужен std::function
.Хотя это относительно редко.
int main() {
auto adder = [](int x) {
return [=](int y) {
return x + y;
};
};
// alternatively- you MUST copy the argument as it will cease to exist
// but once it's in the lambda, you can use "mutable" to allow you to
// modify the copy that each lambda has.
/*
auto adder = [](int x) {
return [=](int y) mutable {
return x += y;
};
};
*/
std::vector<decltype(adder(0))> adders;
adders.emplace_back(adder(0));
adders.emplace_back(adder(1));
std::for_each(adders.begin(), adders.end(), [](decltype(*adders.begin())& ref) {
std::cout << ref(33);
});
std::cin.get();
}
MSVC на самом деле не скомпилирует этот маленький фрагмент, но я думаю, что это ошибка, и, судя по отчетам вашего компилятора, я ожидаю, что он скомпилируется там и действительно будет работатьправильно.