我最近决定将指针向量更改为智能指针向量,但尽管这些智能指针与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&lt;&gt;与shared_ptr&lt;&gt;基本上具有相同的界面, 但我不能在我的项目中使用boost。
是否有一个(通用)适配器我可以编写以允许mem_fun或mem_fun_ref工作? 我最好寻找一个在线解决方案,例如:
find_if( v.begin(), v.end(), mem_fun( some_adapter( &Base::valid ) ) );
因为这类线有很多相似的出现。
答案 0 :(得分:4)
你想使用boost mem_fn,因为它完全符合你的要求。请看这个链接,特别是PURPOSE部分。
顺便说一下,你应该传递对const的引用,而不是is_any_valid中的整个向量(你的valid()也应该是const)。