fork(4) download
  1. #include <iostream>
  2.  
  3. #define EXPAND(x) x
  4. #define FOR_EACH_2(what, delimiter, x, y) what((x), (y))
  5. #define FOR_EACH_4(what, delimiter, x, y, ...)\
  6.   what((x), (y)) delimiter \
  7.   EXPAND(FOR_EACH_2(what, delimiter, __VA_ARGS__))
  8. #define FOR_EACH_6(what, delimiter, x, y, ...)\
  9.   what((x), (y)) delimiter \
  10.   EXPAND(FOR_EACH_4(what, delimiter, __VA_ARGS__))
  11.  
  12. #define FOR_EACH_NARG(...) FOR_EACH_NARG_(__VA_ARGS__, FOR_EACH_RSEQ_N())
  13. #define FOR_EACH_NARG_(...) EXPAND(FOR_EACH_ARG_N(__VA_ARGS__))
  14. #define FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, N, ...) N
  15. #define FOR_EACH_RSEQ_N() 6, 5, 4, 3, 2, 1, 0
  16. #define CONCATENATE(x,y) x##y
  17. #define FOR_EACH_(N, what, delimiter, ...) EXPAND(CONCATENATE(FOR_EACH_, N)(what, delimiter, __VA_ARGS__))
  18.  
  19. #define FOR_EACH(what, delimiter, ...) FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, delimiter, __VA_ARGS__)
  20.  
  21. void foo(int x, float y) {
  22. std::cout << "foo(" << x << ", " << y << ")\n";
  23. }
  24.  
  25. int main() {
  26. FOR_EACH(foo, ;, 1, 3.14, 2, 1.41, 3, 1.73);
  27. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
foo(1, 3.14)
foo(2, 1.41)
foo(3, 1.73)