Недавно я принял решение изменить вектор указателей на вектор интеллектуальных указателей, но хотя эти интеллектуальные указатели совместимы с 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‹>, но я не могу использовать boost в своем проекте.
Есть ли (общий) адаптер, который я мог бы написать, чтобы позволить работать mem_fun или mem_fun_ref? Я предпочитаю искать встроенное решение, например:
find_if( v.begin(), v.end(), mem_fun( some_adapter( &Base::valid ) ) );
потому что есть много подобных вхождений таких линий.