fork(1) download
#include <iostream>
#include <utility>
#include <iterator>

    template<typename C, typename F>
    void for_each_flat( C&& c, F&& f );

    template<typename C, typename F>
    void for_each_flat_helper( C&& c, F&& f, std::true_type /*is_iterable*/ ) {
      for( auto&& x : std::forward<C>(c) )
        for_each_flat(std::forward<decltype(x)>(x), f);
    }
    template<typename D, typename F>
    void for_each_flat_helper( D&& data, F&& f, std::false_type /*is_iterable*/ ) {
      std::forward<F>(f)(std::forward<D>(data));
    }
    
    namespace adl_aux {
      using std::begin; using std::end;
      template<typename C> decltype( begin( std::declval<C>() ) ) adl_begin(C&&);
      template<typename C> decltype( end( std::declval<C>() ) ) adl_end(C&&);
    }
    using adl_aux::adl_begin;
    using adl_aux::adl_end;

    template<typename> struct type_sink {typedef void type;};
    template<typename T> using TypeSink = typename type_sink<T>::type;

    template<typename T, typename=void>
    struct is_iterable:std::false_type{};
    template<typename T>
    struct is_iterable<T, TypeSink< decltype( adl_begin( std::declval<T>() ) ) >>:std::true_type{};

    template<typename C, typename F>
    void for_each_flat( C&& c, F&& f ) {
      for_each_flat_helper( std::forward<C>(c), std::forward<F>(f), is_iterable<C>() );
    }        
   
   
int main() {
	int x[2][3][4] = {0};
	for_each_flat( x, [](int y) { std::cout << y << "\n"; });
	// your code goes here
	return 0;
}
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