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

标签 c++ stl smart-pointers

我最近决定将指针 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/

相关文章:

c++ - 具有数组构造函数方法的 constexpr 类

c++ - 函数签名末尾的 && 是什么意思(在右括号之后)?

c++ - 如何得知两个 `std::multimap` 是否具有相同的内容?

C++ FAQ Lite Smart_Ptr 类无法运行?

.net - Windows窗体控件库;托管和非托管

c++ - 如何在容器中存储不同类型的模板化对象?

c++ - 插入指向 vector 的指针时出错

c++ - for(int i=0;i<myVector.size();++i) 调用了多少次 size()?

带有宏的类中的 C++ 自动 shared_ptr 类型

c++ - 如何使智能指针指向对象的拷贝