#include <iostream>
#include <vector>
#include <map>
#include <type_traits>
template <typename> struct is_pair : std::false_type {};
template <typename T, typename U> struct is_pair<std::pair<T, U>> : std::true_type {};
namespace extract
{
template <typename Iter>
auto
e(Iter it)
-> typename std::enable_if<is_pair<typename std::iterator_traits<Iter>::value_type>::value,
decltype(it->second)>::type
{
return it->second;
}
template <typename Iter>
auto
e(Iter it)
-> typename std::enable_if<!is_pair<typename std::iterator_traits<Iter>::value_type>::value,
decltype(*it)>::type
{
return *it;
}
}
template<typename Iterator>
void print(Iterator begin, Iterator end)
{
while (begin != end)
{
std::cout << extract::e(begin) << std::endl;
++begin;
}
}
int main()
{
std::vector<int> v(3, 1);
std::map<int, int> m = {{0, 10}, {1, 11}, {2, 12}};
print(v.begin(), v.end());
print(m.begin(), m.end());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0cnVjdCBpc19wYWlyIDogc3RkOjpmYWxzZV90eXBlIHt9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IGlzX3BhaXI8c3RkOjpwYWlyPFQsIFU+PiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwoKbmFtZXNwYWNlIGV4dHJhY3QKewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CiAgICBhdXRvCiAgICBlKEl0ZXIgaXQpCiAgICAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19wYWlyPHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXI+Ojp2YWx1ZV90eXBlPjo6dmFsdWUsCiAgICAgICAgZGVjbHR5cGUoaXQtPnNlY29uZCk+Ojp0eXBlCiAgICB7CiAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAgICB9CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CiAgICBhdXRvCiAgICBlKEl0ZXIgaXQpCiAgICAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfcGFpcjx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZT46OnZhbHVlLAogICAgICAgIGRlY2x0eXBlKCppdCk+Ojp0eXBlCiAgICB7CiAgICAgICAgcmV0dXJuICppdDsKICAgIH0KCn0KCnRlbXBsYXRlPHR5cGVuYW1lIEl0ZXJhdG9yPgp2b2lkIHByaW50KEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCnsKICAgIHdoaWxlIChiZWdpbiAhPSBlbmQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGV4dHJhY3Q6OmUoYmVnaW4pIDw8IHN0ZDo6ZW5kbDsKICAgICAgICArK2JlZ2luOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPGludD4gdigzLCAxKTsKICAgIHN0ZDo6bWFwPGludCwgaW50PiBtID0ge3swLCAxMH0sIHsxLCAxMX0sIHsyLCAxMn19OwoKICAgIHByaW50KHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICBwcmludChtLmJlZ2luKCksIG0uZW5kKCkpOwoKICAgIHJldHVybiAwOwp9Cg==