Не вопрос (C++17, свёртка):
template<typename... Funcs>
auto compose_sq(Funcs&&... funcs)
{
return [=]{ (std::invoke(funcs), ...); };
}
int main()
{
auto f1 = []{ std::cout << "f1" << std::endl; };
auto f2 = []{ std::cout << "f2" << std::endl; };
auto f3 = compose_sq(f1, f2);
f3();
return 0;
}
Ну а если нужно сохранить результат возврата значения первой функции, то придётся ещё немного кода написать. Думаю, что общее направление вам понятно. Если что, то дополнительную информацию можно найти тут:
https://en.cppreference.com/w/cpp/language/fold