#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>

namespace my
{
	template <typename Functor, typename SContainer>
	class map_proxy
	{
	public:
		map_proxy(Functor f, SContainer const & c)
			: m_f(f)
			, m_c(c)
		{
		}
	
		template <typename TContainer>
		operator TContainer () const
		{
			TContainer c;
			std::transform(std::begin(m_c), std::end(m_c), std::back_inserter(c), m_f);
			return c;
		}
		
	private:
		Functor m_f;
		SContainer const & m_c;
	};
	
	template <typename Functor, typename Container>
	map_proxy<Functor, Container> map(Functor f, Container const & c)
	{
		return map_proxy<Functor, Container>(f, c);
	}
}

int main()
{
	using my::map;

	std::vector<double> numbers = { 0.3, 0.4, 0.5, 0.6, 0.7 };
	std::list<int> result = map(
		[](double n) -> int { return static_cast<int>(n * 2.0 + 1) / 2; },
		numbers
	);
	
	std::copy(std::begin(result), std::end(result), std::ostream_iterator<int>(std::cout, "\n"));
	return 0;
}
