#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';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPCB0eXBlbmFtZSBDb250LCB0eXBlbmFtZSBGaWx0LCB0eXBlbmFtZSBUcmFuID4KYXV0byBmaWx0ZXIoIENvbnQmIGNudCwgRmlsdCBmdW5jLCBUcmFuIHRyYW4gKSAtPiBzdGQ6OnZlY3RvcjwgZGVjbHR5cGUoIHRyYW4oY250WzBdICkgKSA+CnsKICBzdGQ6OnZlY3RvcjwgZGVjbHR5cGUoIHRyYW4oIGNudFswXSApICkgPiByZXQ7CiAgZm9yICggYXV0byYgaXRlbSA6IGNudCApIGlmICggZnVuYyggaXRlbSApICkgcmV0LnB1c2hfYmFjayggdHJhbiggaXRlbSApICk7CiAgcmV0dXJuIHJldDsKfQoKaW50IG1haW4oIHZvaWQgKQp7CiAgc3RkOjp2ZWN0b3I8IGludCA+IG51bWJlcnMgPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfTsKCiAgYXV0byBpc19vZGQgPSBbXSggY29uc3QgaW50IHggKSB7IHJldHVybiB4ICUgMiA9PSAxOyB9OwoKICBhdXRvIHRyYW5zZm9ybSA9IFtdKCBpbnQmIHggKXsgcmV0dXJuICZ4OyB9OwoKICBhdXRvIG9kZF9udW1iZXJzID0gZmlsdGVyKCBudW1iZXJzLCBpc19vZGQsIHRyYW5zZm9ybSApOwoKICBmb3IgKCBjb25zdCBhdXRvJiBvZGRfbnVtYmVyIDogb2RkX251bWJlcnMgKQogICAgc3RkOjpjb3V0IDw8ICpvZGRfbnVtYmVyIDw8ICdcbic7Cn0=