Самый ясный способ для меня это boost::bind
:
#include <boost/bind.hpp>
...
transform(v.begin(), v.end(), back_inserter(is), bind( &Foo::i, _1 ) );
Конечно, вы можете создать свою собственную функцию доступа к членам, но я верю, что это сделает ваш код менее читабельным. boost :: bind - широко известная библиотека, поэтому ее использование сделает ваш код довольно читабельным, и вам не нужно будет читать вспомогательные функции (которые могут иногда содержать ошибки)
Второй способ, который я предпочитаю, это просто использовать цикл for (в данном конкретном случае):
for ( vector<Foo>::const_iterator it = v.begin(), it != v.end(); ++it )
is.push_back( it->i );
Может быть, такие простые петли не модно использовать, но они очень четкие.