#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKbmFtZXNwYWNlIG15CnsKCXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yLCB0eXBlbmFtZSBTQ29udGFpbmVyPgoJY2xhc3MgbWFwX3Byb3h5Cgl7CglwdWJsaWM6CgkJbWFwX3Byb3h5KEZ1bmN0b3IgZiwgU0NvbnRhaW5lciBjb25zdCAmIGMpCgkJCTogbV9mKGYpCgkJCSwgbV9jKGMpCgkJewoJCX0KCQoJCXRlbXBsYXRlIDx0eXBlbmFtZSBUQ29udGFpbmVyPgoJCW9wZXJhdG9yIFRDb250YWluZXIgKCkgY29uc3QKCQl7CgkJCVRDb250YWluZXIgYzsKCQkJc3RkOjp0cmFuc2Zvcm0oc3RkOjpiZWdpbihtX2MpLCBzdGQ6OmVuZChtX2MpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYyksIG1fZik7CgkJCXJldHVybiBjOwoJCX0KCQkKCXByaXZhdGU6CgkJRnVuY3RvciBtX2Y7CgkJU0NvbnRhaW5lciBjb25zdCAmIG1fYzsKCX07CgkKCXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yLCB0eXBlbmFtZSBDb250YWluZXI+CgltYXBfcHJveHk8RnVuY3RvciwgQ29udGFpbmVyPiBtYXAoRnVuY3RvciBmLCBDb250YWluZXIgY29uc3QgJiBjKQoJewoJCXJldHVybiBtYXBfcHJveHk8RnVuY3RvciwgQ29udGFpbmVyPihmLCBjKTsKCX0KfQoKaW50IG1haW4oKQp7Cgl1c2luZyBteTo6bWFwOwoKCXN0ZDo6dmVjdG9yPGRvdWJsZT4gbnVtYmVycyA9IHsgMC4zLCAwLjQsIDAuNSwgMC42LCAwLjcgfTsKCXN0ZDo6bGlzdDxpbnQ+IHJlc3VsdCA9IG1hcCgKCQlbXShkb3VibGUgbikgLT4gaW50IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4obiAqIDIuMCArIDEpIC8gMjsgfSwKCQludW1iZXJzCgkpOwoJCglzdGQ6OmNvcHkoc3RkOjpiZWdpbihyZXN1bHQpLCBzdGQ6OmVuZChyZXN1bHQpLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8aW50PihzdGQ6OmNvdXQsICJcbiIpKTsKCXJldHVybiAwOwp9Cg==