很长一段时间以来,我一直在手拉手使用std::vector和std::shared\u ptr。最近我开始使用std::shared\u ptr<;常数T>每当需要指向常量对象的指针时。这一切都没问题,因为std::shared\u ptr<;T>可以强制转换为std::shared\u ptr<;常数T>然后它们共享同一个参考计数器,一切感觉都很自然
但是当我尝试使用诸如std::vector<;标准::共享\u ptr<;常数T>&燃气轮机</我遇到麻烦了。为了简化,我将表示两种结构:
模板<;T级>;
使用SharedPtrVector=std::vector<;标准::共享\u ptr<;T>>;;
模板<;T级>;
使用SharedConstructorVector=std::vector<;标准::共享\u ptr<;常数T>>;;
问题是,尽管SharedPtrVector和SharedConstructrVector非常相似,SharedConstructrVector不能强制转换为SharedPtrVector
因此,每次我都想成为一个常量,并编写一个函数,如:
void f(const sharedconstrvector<;T>;&vec);
我无法通过constSharedPtrVector<;T>至f
我对此考虑了很多,并考虑了几个备选方案:
-
写转换函数
模板<;typename T>; SharedConstructorVector<;T>;toConst(常数共享向量<;T>;); -
以一般形式编写代码:
模板<;typename T>; void f(const std::vector<;std::shared_ptr<;T>;>;vec);或
模板<;typename滴定仪>; 空隙f(滴定仪开始,滴定仪结束); -
放弃
std::vector<;标准::共享\u ptr<;常数T>&燃气轮机
1的问题。是计算开销和增加的代码丑陋度,而2。使代码具有“一切都是模板”的风格
我是一个没有经验的程序员,我不想走错方向。我想听听有这个问题经验的人的建议
我建议审查您的设计,以确定这些对象的明确所有者。这是由于缺乏明确的所有权,导致人们使用共享智能指针
Bjarne Stroustrup建议将使用智能指针作为最后手段。他的建议(从最好到最坏)是:
- 按值存储对象
- 按值在容器中存储多个对象
- 如果其他方法都不起作用,请使用智能指针
参见Bjarne Stroustrup-C++的精髓:在0:37:40处有C++84、C++98、C++11和C++14中的示例