#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;
}
