为什么weak_ptr没有比较运算符==?

时间:2018-04-13 00:45:39

标签: c++ c++11 smart-pointers comparison-operators weak-ptr

如果我有vector<weak_ptr<Type>>,我就无法使用vector::erase(remove())删除所需的weak_ptr,因为它没有比较运算符==。

必须将lambda谓词传递给remove_if中的vector::erase(remove_if()),比较通过weak_ptr::_Get()

访问的基础原始指针

_Get()以下划线和大写字母开头,意味着它是为实施而保留的,并不意味着用户可以访问。

很明显,weak_ptr并不是以这种方式存储,而是为什么?

我在考虑使用vector<weak_ptr<>>来保存weak_ptr个子类只有一些我在经理类中的对象需要进一步处理因此,通过lock()确保它们没有在管理类中删除(在多线程应用程序中)。

管理员警告子类创建和删除对象,使vector<weak_ptr<>>保持最新。

1 个答案:

答案 0 :(得分:0)

您可以将erase-remove惯用法与显式谓词一起使用。

例如:

#include <functional>
#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::make_shared;
using std::remove_if;
using std::vector;
using std::weak_ptr;

int main()
{
  auto p7 = make_shared<int>(7);
  auto p8 = make_shared<int>(8);
  auto p10 = make_shared<int>(10);
  auto p11 = make_shared<int>(11);

  vector<weak_ptr<int>> v;

  v.push_back(p7);
  v.push_back(p8);

  {
    auto p9 = make_shared<int>(9);
    v.push_back(p9);
    // p9 dtor'd here
  }

  v.push_back(p10);
  v.push_back(p11);
  p8.reset(new int{18}); // old p8 dtor'd here
  p10 = make_shared<int>(110); // old p10 dtor'd here

  // Only 7 and 11 left.

  v.erase(remove_if(v.begin(), v.end(), [](auto w){ if (auto spt = w.lock()) return false; else return true; }), v.end() );
  for (auto w : v)
  {
    cout << "Value is ";
    if (auto s = w.lock())
    {
      cout << *s << "\n";
    }
    else
    {
      cout << "MISSING!\n";
    }
  }
}