#include #include template struct Continuable; template Continuable<> make_continuable(Args&&...) { return Continuable<>(); } template struct Continuable { template Continuable then(Args&&...) { return Continuable(); } template Continuable all(Args&&...) { return Continuable(); } }; template Continuable<> operator&& (Continuable&&, Continuable&&) { return Continuable<>(); } template Continuable<> operator|| (Continuable&&, Continuable&&) { return Continuable<>(); } Continuable<> http_request(std::string const& /*URL*/) { return make_continuable([=](std::function&& callback) { // Do request... callback("some HTTP content"); }); } void test_mockup() { Continuable<> c1 = make_continuable([] { }); Continuable<> c2 = make_continuable([] { }); Continuable<> c3 = make_continuable([] { }); Continuable<> c11 = (std::move(c1) && std::move(c2)) || std::move(c3); }