fork(1) download
  1. #include <iostream>
  2. #include <utility>
  3. #include <iterator>
  4.  
  5. template<typename C, typename F>
  6. void for_each_flat( C&& c, F&& f );
  7.  
  8. template<typename C, typename F>
  9. void for_each_flat_helper( C&& c, F&& f, std::true_type /*is_iterable*/ ) {
  10. for( auto&& x : std::forward<C>(c) )
  11. for_each_flat(std::forward<decltype(x)>(x), f);
  12. }
  13. template<typename D, typename F>
  14. void for_each_flat_helper( D&& data, F&& f, std::false_type /*is_iterable*/ ) {
  15. std::forward<F>(f)(std::forward<D>(data));
  16. }
  17.  
  18. namespace adl_aux {
  19. using std::begin; using std::end;
  20. template<typename C> decltype( begin( std::declval<C>() ) ) adl_begin(C&&);
  21. template<typename C> decltype( end( std::declval<C>() ) ) adl_end(C&&);
  22. }
  23. using adl_aux::adl_begin;
  24. using adl_aux::adl_end;
  25.  
  26. template<typename> struct type_sink {typedef void type;};
  27. template<typename T> using TypeSink = typename type_sink<T>::type;
  28.  
  29. template<typename T, typename=void>
  30. struct is_iterable:std::false_type{};
  31. template<typename T>
  32. struct is_iterable<T, TypeSink< decltype( adl_begin( std::declval<T>() ) ) >>:std::true_type{};
  33.  
  34. template<typename C, typename F>
  35. void for_each_flat( C&& c, F&& f ) {
  36. for_each_flat_helper( std::forward<C>(c), std::forward<F>(f), is_iterable<C>() );
  37. }
  38.  
  39.  
  40. int main() {
  41. int x[2][3][4] = {0};
  42. for_each_flat( x, [](int y) { std::cout << y << "\n"; });
  43. // your code goes here
  44. return 0;
  45. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0