с использованием mem_fun () для контейнера интеллектуальных указателей

Недавно я принял решение заменить вектор указателей на вектор интеллектуальных указателей, но хотя эти интеллектуальные указатели совместимы с STL, я не смог преобразовать некоторые алгоритмы для их использования.

Рассмотрим

class Base
{
     ...
     virtual bool valid();
};

Как преобразовать

bool is_any_valid( vector< Base* > v )
{
    return v.end() != 
        find_if( v.begin(), v.end(), mem_fun( &Base::valid ) );
}

в это?

bool is_any_valid( vector< my_smart_ptr< Base > v )
{
    // mem_fun() fails, because valid() is not a member of my_smart_ptr< Base > !!! 
    // return v.end() != 
    //    find_if( v.begin(), v.end(), mem_fun( &Base::valid ) );
}

Вы можете предположить, что my_smart_pointer <> по сути имеет тот же интерфейс, что и shared_ptr <>, но я не могу использовать ускорение в моем проекте.

Есть ли (общий) адаптер, который я мог бы написать, чтобы позволить mem_fun или mem_fun_ref работать? Я предпочтительно ищу встроенное решение, например:

 find_if( v.begin(), v.end(), mem_fun( some_adapter( &Base::valid ) ) );

, потому что есть много подобных случаев появления таких строк.

6
задан Grim Fandango 22 November 2010 в 13:37
поделиться