我最近决定将指针 vector 更改为智能指针 vector ,但尽管这些智能指针与 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<> 具有本质上相同的接口(interface), 但我不能在我的项目中使用 boost。
有没有我可以编写的(通用)适配器来允许 mem_fun 或 mem_fun_ref 工作? 我最好寻找在线解决方案,例如:
find_if( v.begin(), v.end(), mem_fun( some_adapter( &Base::valid ) ) );
因为有很多类似的行出现。
最佳答案
您想使用 boost mem_fn,因为它完全符合您的要求。查看此链接,特别是 PURPOSE 部分。
http://www.boost.org/doc/libs/1_45_0/libs/bind/mem_fn.html
顺便说一句,您应该传递对 const 的引用,而不是 is_any_valid 中的整个 vector (并且您的 valid() 也应该是 const)。
关于c++ - 使用 mem_fun() 作为智能指针的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4245954/