我最近了解了各种智能指针类型,特别是unique_ptr将非常有用,shared_ptr与weak_ptr也在一定程度上很有用。然而,我不确定如何创建可以处理任何指针类型的“通用”函数,以及是否这样做是个好主意。
假设你有一个由智能指针封装的对象向量,并且你想使用一个函数对所有元素应用某些操作,类似于以下内容:
假设你有一个由智能指针封装的对象向量,并且你想使用一个函数对所有元素应用某些操作,类似于以下内容:
void doSomething(vector<shared_ptr<SomeType>>& array) {
// iterate over all array elements and do something
}
显然,你需要复制这个函数三次,分别针对shared_ptr、unique_ptr和weak_ptr,这有点繁琐。更好的方法是使用“通用”或“多态”的智能指针类型,以适应所有这些类型作为函数参数使用:
void doSomething(vector<generic_ptr<SomeType>>& array) {
// iterate over all array elements and do something
// no matter if array is a vector<shared_ptr> or vector<unique_ptr>
}
那么,是否存在这样的智能指针?如果有的话-使用它可能会出现哪些问题?如果没有-为什么没有?
template<typename generic_ptr> void doSomething(vector<generic_ptr<SomeType>>& array)
这样的代码是否可行。 - Bernhard Barkerdeque
怎么办?如果用户有一个带有非标准分配器的向量呢?在整个容器类型上进行模板化更自然。 - Kerrek SBRangeOfPointersToSomeType
或类似的名称,以向读者表明doSomething
函数将对元素进行解引用,并期望在其末尾找到一个SomeType
。 - Steve Jessop