Вы можете сделать рекурсивную лямбду без стирания типа (std :: function).Вот как это делается с общими лямбдами:
auto recurse = [](auto lambda) {
return [lambda](auto&&... args) {
return lambda(lambda, std::forward<decltype(args)>(args)...);
};
};
auto my_recursive_lambda = recurse([](auto self, std::map<int, int>& memo, int n) {
if (n == 0) {
return 1;
} else if (n < 0) {
return 0;
}
auto find = memo.find(n);
if (find != memo.end()) {
return find->second;
}
int num_steps = self(self, memo, n - 1) + self(self, memo, n - 2) + self(self, memo, n - 3);
memo[n] = num_steps;
return num_steps;
});
my_recursive_lambda(memo, n); // magic!
Если вам действительно нужно это для c ++ 11, вам понадобится std::function
:
auto recurse = std::function<int(std::map<int, int>&, int)>{};
recurse = [&recurse](std::map<int, int>& memo, int n) {
// same as you tried.
}
Или если вы откажетесьДля удобства вы можете раскрутить свой лямбда-тип вручную:
struct {
auto operator()(std::map<int, int>& memo, int n) -> int {
auto&& recurse = *this;
if (n == 0) {
return 1;
} else if (n < 0) {
return 0;
}
auto find = memo.find(n);
if (find != memo.end()) {
return find->second;
}
//int num_steps = recurse(n - 1) + recurse(n - 2) + recurse(n - 3); // attempt (1) or (2)
int num_steps = recurse(memo, n - 1) + recurse(memo, n - 2) + recurse(memo, n - 3); // attempt (3)
memo[n] = num_steps;
return num_steps;
}
} recurse{};