#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< is_iterable<T>::value >::type
for_all_ele(T&& arr,_F&& fn)
{
for(auto &x:arr)
for_all_ele(x,fn);
}
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);
}
#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+KDApKTsKCgoKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCx0eXBlbmFtZSBfRj4KaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBpc19pdGVyYWJsZTxUPjo6dmFsdWUgPjo6dHlwZQpmb3JfYWxsX2VsZShUJiYgYXJyLF9GJiYgZm4pCnsKCWZvcihhdXRvICZ4OmFycikKCQlmb3JfYWxsX2VsZSh4LGZuKTsKCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULHR5cGVuYW1lIF9GPgppbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IG5vdCBpc19pdGVyYWJsZTxUPjo6dmFsdWUgPjo6dHlwZQpmb3JfYWxsX2VsZShUJiYgeCxfRiYmIGZuKQp7Cglmbih4KTsKfQoKCgojaWZkZWYgbnNwCn0KdXNpbmcgbmFtZXNwYWNlIHRlc3Q7CiNlbmRpZgoKCgoKI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKQp7CglpbnQgeFsyXVs1XT0gezEsMiw1LDY4LDksMTIsMzUsNiwzMiw4OX07CgoJZm9yX2FsbF9lbGUoeCxbXShpbnQgJnhpail7CWNvdXQ8PHhpajw8IiwiOwl9KTsKCQoJcmV0dXJuIDA7Cn0KCgoKCgoKCgoKCg==
prog.cpp: In instantiation of 'typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type test::for_all_ele(T&&, _F&&) [with T = int (&)[5]; _F = main()::<lambda(int&)>&; typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type = void]':
prog.cpp:47:14: required from 'typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type test::for_all_ele(T&&, _F&&) [with T = int (&)[2][5]; _F = main()::<lambda(int&)>; typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type = void]'
prog.cpp:75:47: required from here
prog.cpp:47:14: error: no matching function for call to 'for_all_ele(int&, main()::<lambda(int&)>&)'
for_all_ele(x,fn);
^
prog.cpp:44:1: note: candidate: template<class T, class _F> typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type test::for_all_ele(T&&, _F&&)
for_all_ele(T&& arr,_F&& fn)
^
prog.cpp:44:1: note: template argument deduction/substitution failed:
prog.cpp: In substitution of 'template<class T, class _F> typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type test::for_all_ele(T&&, _F&&) [with T = int&; _F = main()::<lambda(int&)>&]':
prog.cpp:47:14: recursively required from 'typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type test::for_all_ele(T&&, _F&&) [with T = int (&)[5]; _F = main()::<lambda(int&)>&; typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type = void]'
prog.cpp:47:14: required from 'typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type test::for_all_ele(T&&, _F&&) [with T = int (&)[2][5]; _F = main()::<lambda(int&)>; typename std::enable_if<decltype (is_iterable_impl<T>(0))::value>::type = void]'
prog.cpp:75:47: required from here
prog.cpp:44:1: error: no type named 'type' in 'struct std::enable_if<false, void>'