Бен Фойгт предлагает использовать Y-комбинаторы (которые являются отличным предложением для стандартной библиотеки, кстати), но ваша проблема проще. Вы можете ввести небольшой шаблонный функтор, который будет вызываться вместо лямбды:
template<typename T>
struct recallable_impl {
template<typename... Args>
recallable_impl& operator()(Args&&... args) {
f(std::forward<Args>(args)...);
return *this;
}
template<typename F>
recallable_impl(F&& f)
: f{std::forward<F>(f)}
{}
private:
T f;
};
template<typename T>
decltype(auto) recallable(T&& f) {
return recallable_impl<std::decay_t<T>>(std::forward<T>(f));
}
Тогда вашей лямбде даже не нужно будет явно что-либо возвращать:
int main() {
int a = 5;
recallable([&](int b){std::cout << (a + b) << std::endl;})(4)(5)(6)(7)(8);
}