正在使用std::vector<标准::共享\u ptr<常数T&gt&燃气轮机;反模式?

很长一段时间以来,我一直在手拉手使用std::vectorstd::shared\u ptr。最近我开始使用std::shared\u ptr<常数T&gt每当需要指向常量对象的指针时。这一切都没问题,因为std::shared\u ptr<T&gt可以强制转换为std::shared\u ptr<常数T&gt然后它们共享同一个参考计数器,一切感觉都很自然

但是当我尝试使用诸如std::vector&lt;标准::共享\u ptr&lt;常数T&gt&燃气轮机</我遇到麻烦了。为了简化,我将表示两种结构:

模板&lt;T级&gt;
使用SharedPtrVector=std::vector&lt;标准::共享\u ptr&lt;T&gt&gt;;
模板&lt;T级&gt;
使用SharedConstructorVector=std::vector&lt;标准::共享\u ptr&lt;常数T&gt&gt;;

问题是,尽管SharedPtrVectorSharedConstructrVector非常相似,SharedConstructrVector不能强制转换为SharedPtrVector

因此,每次我都想成为一个常量,并编写一个函数,如:

void f(const sharedconstrvector&lt;T&gt;&vec);

我无法通过constSharedPtrVector&lt;T&gt至f

我对此考虑了很多,并考虑了几个备选方案:

  1. 写转换函数

    模板&lt;typename T&gt;
    SharedConstructorVector&lt;T&gt;toConst(常数共享向量&lt;T&gt;);
    
  2. 以一般形式编写代码:

    模板&lt;typename T&gt;
    void f(const std::vector&lt;std::shared_ptr&lt;T&gt;&gt;vec);
    

    模板&lt;typename滴定仪&gt;
    空隙f(滴定仪开始,滴定仪结束);
    
  3. 放弃std::vector&lt;标准::共享\u ptr&lt;常数T&gt&燃气轮机

1的问题。是计算开销和增加的代码丑陋度,而2。使代码具有“一切都是模板”的风格

我是一个没有经验的程序员,我不想走错方向。我想听听有这个问题经验的人的建议

我建议审查您的设计,以确定这些对象的明确所有者。这是由于缺乏明确的所有权,导致人们使用共享智能指针

Bjarne Stroustrup建议将使用智能指针作为最后手段。他的建议(从最好到最坏)是:

  1. 按值存储对象
  2. 按值在容器中存储多个对象
  3. 如果其他方法都不起作用,请使用智能指针

参见Bjarne Stroustrup-C++的精髓:在0:37:40处有C++84、C++98、C++11和C++14中的示例

发表评论