#include <iostream>
#include <typeinfo>
#include <type_traits>
#include <bits/range_access.h>
/* comment the following line and everything is fine... */
#define nsp
#ifdef nsp
namespace test
{
#endif
namespace detail
{
// To allow ADL with custom begin/end
using std::begin;
using std::end;
template <typename T>
auto is_iterable_impl(int)
-> decltype (
begin(std::declval<T&>()) != end(std::declval<T&>()), // begin/end and operator !=
++std::declval<decltype(begin(std::declval<T&>()))&>(), // operator ++
*begin(std::declval<T&>()), // operator*
std::true_type {});
template <typename T>
std::false_type is_iterable_impl(...);
}
template <typename T>
using is_iterable = decltype(detail::is_iterable_impl<T>(0));
template <typename T,typename _F>
inline typename std::enable_if< not is_iterable<T>::value >::type
for_all_ele(T&& x,_F&& fn)
{
fn(x);
}
template <typename T,typename _F>
inline typename std::enable_if< is_iterable<T>::value >::type
for_all_ele(T&& arr,_F&& fn)
{
for(auto &x:arr)
for_all_ele(x,fn);
}
#ifdef nsp
}
using namespace test;
#endif
#include <iostream>
using namespace std;
int main()
{
int x[2][5]= {1,2,5,68,9,12,35,6,32,89};
for_all_ele(x,[](int &xij){ cout<<xij<<","; });
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgoKLyogY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgYW5kIGV2ZXJ5dGhpbmcgaXMgZmluZS4uLiAqLwojZGVmaW5lIG5zcAoKI2lmZGVmIG5zcApuYW1lc3BhY2UgdGVzdAp7CiNlbmRpZgoKCm5hbWVzcGFjZSBkZXRhaWwKewoJLy8gVG8gYWxsb3cgQURMIHdpdGggY3VzdG9tIGJlZ2luL2VuZAoJdXNpbmcgc3RkOjpiZWdpbjsKCXVzaW5nIHN0ZDo6ZW5kOwoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJYXV0byBpc19pdGVyYWJsZV9pbXBsKGludCkKCS0+IGRlY2x0eXBlICgKCSAgICBiZWdpbihzdGQ6OmRlY2x2YWw8VCY+KCkpICE9IGVuZChzdGQ6OmRlY2x2YWw8VCY+KCkpLCAvLyBiZWdpbi9lbmQgYW5kIG9wZXJhdG9yICE9CgkgICAgKytzdGQ6OmRlY2x2YWw8ZGVjbHR5cGUoYmVnaW4oc3RkOjpkZWNsdmFsPFQmPigpKSkmPigpLCAvLyBvcGVyYXRvciArKwoJICAgICpiZWdpbihzdGQ6OmRlY2x2YWw8VCY+KCkpLCAvLyBvcGVyYXRvcioKCSAgICBzdGQ6OnRydWVfdHlwZSB7fSk7CgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglzdGQ6OmZhbHNlX3R5cGUgaXNfaXRlcmFibGVfaW1wbCguLi4pOwoKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnVzaW5nIGlzX2l0ZXJhYmxlID0gZGVjbHR5cGUoZGV0YWlsOjppc19pdGVyYWJsZV9pbXBsPFQ+KDApKTsKCgoKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBfRj4KaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBub3QgaXNfaXRlcmFibGU8VD46OnZhbHVlID46OnR5cGUKZm9yX2FsbF9lbGUoVCYmIHgsX0YmJiBmbikKewoJZm4oeCk7Cn0KCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBfRj4KaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBpc19pdGVyYWJsZTxUPjo6dmFsdWUgPjo6dHlwZQpmb3JfYWxsX2VsZShUJiYgYXJyLF9GJiYgZm4pCnsKCWZvcihhdXRvICZ4OmFycikKCQlmb3JfYWxsX2VsZSh4LGZuKTsKCn0KCgojaWZkZWYgbnNwCn0KdXNpbmcgbmFtZXNwYWNlIHRlc3Q7CiNlbmRpZgoKCgoKI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKQp7CglpbnQgeFsyXVs1XT0gezEsMiw1LDY4LDksMTIsMzUsNiwzMiw4OX07CgoJZm9yX2FsbF9lbGUoeCxbXShpbnQgJnhpail7CWNvdXQ8PHhpajw8IiwiOwl9KTsKCQoJcmV0dXJuIDA7Cn0KCgoKCgoKCgoKCg==
1,2,5,68,9,12,35,6,32,89,