использование 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‹>, но я не могу использовать boost в своем проекте.

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

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

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


person Grim Fandango    schedule 22.11.2010    source источник


Ответы (1)


Вы хотите использовать boost mem_fn, так как он делает именно то, что вам нужно. Посмотрите на эту ссылку, в частности на раздел ЦЕЛЬ.

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

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

person Jody Hagins    schedule 22.11.2010
comment
mem_fn также доступен в MSVC++, msdn.microsoft.com/en-us/library /bb982851.aspx - person Fred Foo; 22.11.2010
comment
да, именно то, что мне нужно. Только (после прочтения кода) я не могу понять, почему они еще не реализовали ссылку на неконстантный случай! - person Grim Fandango; 22.11.2010