#include <iostream>
#include <vector>
#include <list>
#include <type_traits>
#include <iterator>
template<typename Iterator, typename U = typename std::vector<typename std::iterator_traits<Iterator>::value_type>::iterator, typename = void>
auto f(Iterator beg, Iterator end)
-> typename std::enable_if<!std::is_same<Iterator, U>::value, void>::type
{
for(auto it = beg; it != end; it = std::next(it))
{
std::cout << *it << " iterator!" << std::endl;
}
}
template<typename Iterator, typename U = typename std::vector<typename std::iterator_traits<Iterator>::value_type>::iterator>
auto f(Iterator beg, U end)
-> typename std::enable_if<std::is_same<Iterator, U>::value, void>::type
{
for(auto it = beg; it != end; it = std::next(it))
{
std::cout << *it << " vector!" << std::endl;
}
}
int main()
{
std::list<int> x = {1,2,3};
std::cout << "List" << std::endl;
f(x.begin(), x.end());
std::cout << "Vector" << std::endl;
std::vector<int> v = {1,2,3};
f(v.begin(), v.end());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvciwgdHlwZW5hbWUgVSA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT46Oml0ZXJhdG9yLCB0eXBlbmFtZSA9IHZvaWQ+CmF1dG8gZihJdGVyYXRvciBiZWcsIEl0ZXJhdG9yIGVuZCkKLT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxJdGVyYXRvciwgVT46OnZhbHVlLCB2b2lkPjo6dHlwZQp7CiAgICBmb3IoYXV0byBpdCA9IGJlZzsgaXQgIT0gZW5kOyBpdCA9IHN0ZDo6bmV4dChpdCkpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICppdCA8PCAiIGl0ZXJhdG9yISIgPDwgc3RkOjplbmRsOwogICAgfQp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyYXRvciwgdHlwZW5hbWUgVSA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT46Oml0ZXJhdG9yPgphdXRvIGYoSXRlcmF0b3IgYmVnLCBVIGVuZCkKLT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPEl0ZXJhdG9yLCBVPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCnsKICAgIGZvcihhdXRvIGl0ID0gYmVnOyBpdCAhPSBlbmQ7IGl0ID0gc3RkOjpuZXh0KGl0KSkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgKml0IDw8ICIgdmVjdG9yISIgPDwgc3RkOjplbmRsOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6bGlzdDxpbnQ+IHggPSB7MSwyLDN9OwogICAgc3RkOjpjb3V0IDw8ICJMaXN0IiA8PCBzdGQ6OmVuZGw7CiAgICBmKHguYmVnaW4oKSwgeC5lbmQoKSk7CgogICAgc3RkOjpjb3V0IDw8ICJWZWN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6dmVjdG9yPGludD4gdiA9IHsxLDIsM307CiAgICBmKHYuYmVnaW4oKSwgdi5lbmQoKSk7Cn0=