Недавно я принял решение изменить вектор указателей на вектор интеллектуальных указателей, но хотя эти интеллектуальные указатели совместимы с 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 ) ) );
, потому что есть много похожих случаев таких линий.