использование mem_fun () для контейнера умных указателей - PullRequest
6 голосов
/ 22 ноября 2010

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

, потому что есть много похожих случаев таких линий.

1 Ответ

4 голосов
/ 22 ноября 2010

Вы хотите использовать boost mem_fn, так как он делает именно то, что вы хотите.Посмотрите на эту ссылку, в частности на раздел НАЗНАЧЕНИЕ.

http://www.boost.org/doc/libs/1_45_0/libs/bind/mem_fn.html

Кстати, вы должны передавать ссылку на const, а не весь вектор в is_any_valid (и ваш valid () долженбудь постоянным).

...