#include <iostream>
#include <vector>

template < typename Cont, typename Filt, typename Tran >
auto filter( Cont& cnt, Filt func, Tran tran ) -> std::vector< decltype( tran(cnt[0] ) ) >
{
  std::vector< decltype( tran( cnt[0] ) ) > ret;
  for ( auto& item : cnt ) if ( func( item ) ) ret.push_back( tran( item ) );
  return ret;
}

int main( void )
{
  std::vector< int > numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  auto is_odd = []( const int x ) { return x % 2 == 1; };

  auto transform = []( int& x ){ return &x; };

  auto odd_numbers = filter( numbers, is_odd, transform );

  for ( const auto& odd_number : odd_numbers )
    std::cout << *odd_number << '\n';
}