Skip to content

Instantly share code, notes, and snippets.

@saxbophone
Created July 5, 2024 22:20
Show Gist options
  • Save saxbophone/c4e71a9730fd6693a8447996288a2605 to your computer and use it in GitHub Desktop.
Save saxbophone/c4e71a9730fd6693a8447996288a2605 to your computer and use it in GitHub Desktop.
Manually recreating flow-control constructs using lambdas and goto
template <typename Predicate, typename Body>
constexpr void While(Predicate pred, Body body) {
goto predicate;
loop:
body();
predicate:
if (pred()) { goto loop; }
}
template <typename Body, typename Predicate>
constexpr void DoWhile(Body body, Predicate pred) {
loop:
body();
if (pred()) { goto loop; }
}
template <typename Init, typename Pred, typename Mod, typename Body>
constexpr void For(Init init, Pred pred, Mod mod, Body body) {
init();
goto predicate;
loop:
body();
mod();
predicate:
if (pred()) { goto loop; }
}
#include <iostream>
int main() {
int x = 0;
While([&]{ return x < 5; }, [&]{
std::cout << x << " ";
++x;
});
std::cout << "\n";
DoWhile([&]{
std::cout << x << " ";
++x;
}, [&]{ return x < 10; });
std::cout << "\n";
For([&]{ x = 0; }, [&]{ return x < 5; }, [&]{ ++x; }, [&]{
std::cout << x << " ";
});
std::cout << "\n";
return x;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment