C++ 是否可以在一个容器中存储共享\u ptr和弱\u ptr?

C++ 是否可以在一个容器中存储共享\u ptr和弱\u ptr?,c++,containers,shared-ptr,weak-ptr,C++,Containers,Shared Ptr,Weak Ptr,似乎我遗漏了一些显而易见的东西,但我找不到以下问题的优雅解决方案 我需要创建一个对象集合,其中一些对象由shared_ptr指向(因此归容器本身所有),另一些对象由弱_ptr指向(因此不归容器所有) 这样做的最佳方式是什么?到目前为止,我提出了这样一个相当丑陋的解决方案: template <class Data> struct holder { shared_ptr<Data> owned; weak_ptr<Data> borrowed; s

似乎我遗漏了一些显而易见的东西,但我找不到以下问题的优雅解决方案

我需要创建一个对象集合,其中一些对象由shared_ptr指向(因此归容器本身所有),另一些对象由弱_ptr指向(因此不归容器所有)

这样做的最佳方式是什么?到目前为止,我提出了这样一个相当丑陋的解决方案:

template <class Data>
struct holder {
  shared_ptr<Data> owned;
  weak_ptr<Data> borrowed;

  shared_ptr<Data> get(){
    if(owned) 
       return owned;
    else
       return borrowed.lock();
  }
}
...
vector<holder<MyData>> vec;
模板
结构持有者{
共享ptr拥有;
弱ptr借用;
共享\u ptr get(){
如果(拥有)
归自己所有;
其他的
return.lock();
}
}
...
向量向量机;
我可以为共享的ptr和弱的ptr重载赋值,也可以取消引用以使存储这两种东西“透明”,但所有这些看起来都很复杂,而且不是最优的


有更好的方法吗?

有什么不好的地方吗?您想在一个容器中存储两种不同的类型。实现这一点的唯一方法是创建某种类型的联合类型(如
std::variant
)的容器或自定义类。@MichaelChourdakis由于每个项目有两个指针而不是一个指针,所以存储大小至少增加了一倍。@yesint是这样吗?尺寸这么重要吗?您需要两个分离的不同对象。如果需要其中一个,但不能同时使用两个,则可以使用
std::variant
std::any
。但是,重复使用variant或任意的成员来减小大小并不是那么好。此外,您将检查返回值,以查看弱\u ptr的锁定是否成功,这是一个繁琐的过程。