#include <iostream>
#include <type_traits>
#include <vector>
template <typename T>
auto is_iterator_impl(T* it)
-> decltype(**it, ++(*it), (*it) == (*it), std::true_type());
template <typename T>
auto is_iterator_impl(...) -> std::false_type;
template <typename T>
using is_an_iterator = decltype(is_iterator_impl<T>(0));
template <class R>
std::enable_if_t<!is_an_iterator<R>::value, int>
make_ref(R& res) {
std::cout << "Not an iterator\n";
}
template <class R>
std::enable_if_t<is_an_iterator<R>::value && !std::is_pointer<R>::value>
make_ref(R& res) {
std::cout << "An iterator\n";
}
template <class R>
std::enable_if_t<std::is_pointer<R>::value>
make_ref(R& res) {
std::cout << "A pointer\n";
}
int main() {
int i = 42;
std::vector<int> v{4, 8, 15, 16, 23, 42};
auto it = v.begin();
const char* s = "hello";
make_ref(i);
make_ref(it);
make_ref(s);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KYXV0byBpc19pdGVyYXRvcl9pbXBsKFQqIGl0KQotPiBkZWNsdHlwZSgqKml0LCArKygqaXQpLCAoKml0KSA9PSAoKml0KSwgc3RkOjp0cnVlX3R5cGUoKSk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KYXV0byBpc19pdGVyYXRvcl9pbXBsKC4uLikgLT4gc3RkOjpmYWxzZV90eXBlOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnVzaW5nIGlzX2FuX2l0ZXJhdG9yID0gZGVjbHR5cGUoaXNfaXRlcmF0b3JfaW1wbDxUPigwKSk7Cgp0ZW1wbGF0ZSA8Y2xhc3MgUj4Kc3RkOjplbmFibGVfaWZfdDwhaXNfYW5faXRlcmF0b3I8Uj46OnZhbHVlLCBpbnQ+Cm1ha2VfcmVmKFImIHJlcykgewogICAgc3RkOjpjb3V0IDw8ICJOb3QgYW4gaXRlcmF0b3JcbiI7Cn0KCnRlbXBsYXRlIDxjbGFzcyBSPgpzdGQ6OmVuYWJsZV9pZl90PGlzX2FuX2l0ZXJhdG9yPFI+Ojp2YWx1ZSAmJiAhc3RkOjppc19wb2ludGVyPFI+Ojp2YWx1ZT4KbWFrZV9yZWYoUiYgcmVzKSB7CiAgICBzdGQ6OmNvdXQgPDwgIkFuIGl0ZXJhdG9yXG4iOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgUj4Kc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3BvaW50ZXI8Uj46OnZhbHVlPgptYWtlX3JlZihSJiByZXMpIHsKICAgIHN0ZDo6Y291dCA8PCAiQSBwb2ludGVyXG4iOwp9CgppbnQgbWFpbigpIHsKCWludCBpID0gNDI7CglzdGQ6OnZlY3RvcjxpbnQ+IHZ7NCwgOCwgMTUsIDE2LCAyMywgNDJ9OwoJYXV0byBpdCA9IHYuYmVnaW4oKTsKCWNvbnN0IGNoYXIqCXMgPSAiaGVsbG8iOwoJbWFrZV9yZWYoaSk7CgltYWtlX3JlZihpdCk7CgltYWtlX3JlZihzKTsKfQ==