使用mem_fun()作为智能指针的容器

Gri*_*ngo 6 c++ stl smart-pointers

我最近决定将指针向量更改为智能指针向量,但尽管这些智能指针与STL兼容,但我无法转换某些算法来使用它们.

考虑一下

class Base
{
     ...
     virtual bool valid();
};
Run Code Online (Sandbox Code Playgroud)

你怎么转换

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

进入这个?

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 ) );
}
Run Code Online (Sandbox Code Playgroud)

您可以假设my_smart_pointer <>与shared_ptr <>基本上具有相同的接口,但我不能在我的项目中使用boost.

是否有一个(通用)适配器,我可以写,以允许mem_fun或mem_fun_ref工作?我最好寻找一个在线解决方案,例如:

 find_if( v.begin(), v.end(), mem_fun( some_adapter( &Base::valid ) ) );
Run Code Online (Sandbox Code Playgroud)

因为这类线有很多类似的出现.

Jod*_*ins 4

您想使用 boost mem_fn,因为它正是您想要的。查看此链接,特别是“目的”部分。

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

顺便说一句,您应该传递对 const 的引用,而不是 is_any_valid 中的整个向量(并且您的 valid() 也应该是 const )。