#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

template <typename F, typename... Fs>
auto lambdaList(F f, Fs... fs)
{
    return [=] (auto&... args) { f(args...); lambdaList(fs...)(args...); };
}

template <typename F>
auto lambdaList(F f)
{
    return [=] (auto&... args) { f(args...); };
}

struct Window
{
    Window (int, int, int, int) {}
};

int main()
{
    auto printStarBefore = [] (const std::string& str) {
        std::cout << "* " + str;
    };
    auto printStarAfter = [] (const std::string& str) {
        std::cout << str + " *" << std::endl;
    };

    auto colorBG = [] (const Window&) {
        std::cout << "BG set ";
    };

    auto colorFG = [] (const Window&) {
        std::cout << "FG set\n";
    };

    auto composed = lambdaList(printStarBefore,printStarAfter);
    std::vector<std::string> vec = {"1","2","3","4"};
    std::for_each(std::begin(vec), std::end(vec), composed);

    auto composed2 = lambdaList(colorBG, colorFG);
    Window win(2,25,5,0);
    composed2(win);
}
