#include <iostream>
#include <vector>
#include <map>

namespace extract
{
    template <typename T1, typename T2>
    const T2& e(const std::pair<T1, T2>& r)
    {
        return r.second;
    }

    template <typename T>
    const T& e(const T& r)
    {
        return r;
    }

    template <typename IT>
    auto e_it(IT&& it) -> decltype (e(*it))
    {
        return e(*it);
    }

}

template<typename Iterator>
void print(Iterator begin, Iterator end)
{
    while (begin != end)
    {
        std::cout << extract::e_it(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;
}
