#include <iterator>

template< typename Iter >
struct Iterator
{
	using underlying_iterator = Iter;

private:

    mutable underlying_iterator first,
                          last;

public:

	underlying_iterator begin() { return first; }
	underlying_iterator end() { return last; }

    operator bool() const
    {
        return first != last;
    }

    Iterator& operator++()
    {
        ++first;
        return *this;
    }

    Iterator const& operator++() const
    {
        ++first;
        return *this;
    }

    Iterator operator++(int) const
    {
        Iterator other(*this);
        ++first;
        return other;
    }

    explicit Iterator( underlying_iterator first,
					   underlying_iterator last ):
    	first{first},
    	last{last} {}

	template< typename Container >
    Iterator(Container& c) :
    	Iterator{ std::begin(c), std::end(c) } {}

    decltype(*first) operator*()
    {
        return *first;
    }

    decltype(*first) operator*() const
    {
        return *first;
    }
};

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> const v_const = {43, 38, 129};

    Iterator<std::vector<int>::const_iterator> it_const = v_const;

    while (it_const)
        std::cout << *it_const++ << ' ';
}