矢量<shared_ptr<Foo>>到矢量<shared_ptr<const Foo 的隐式转换> >
Implicit conversion of vector<shared_ptr<Foo> > to vector<shared_ptr<const Foo> >
根据此页面,您可以将shared_ptr<Foo>
隐式转换为shared_ptr<const Foo>
。这是有道理的。
但是,当我尝试将包含shared_ptr<Foo>
的std::vector
转换为包含shared_ptr<const Foo>
的时,我遇到了错误。
有没有实现这种转换的好方法?
否:std::vector<shared_ptr<Foo> >
和 std::vector<shared_ptr<const Foo> >
是不同的类型,因此不能将一个对象视为另一种类型的对象。
如果你真的需要一个std::vector<shared_ptr<const Foo> >
,你可以很容易地创建一个与原始元素相同的元素shared_ptr
s:
std::vector<shared_ptr<Foo> > v;
std::vector<shared_ptr<const Foo> > cv(v.begin(), v.end());
但是,如果您根据迭代器编写代码,则应该没有任何问题。 也就是说,而不是使用
void f(const std::vector<shared_ptr<const Foo> >&);
// used as:
std::vector<shared_ptr<const Foo> > v;
f(v);
你应该使用
template <typename ForwardIterator>
void f(ForwardIterator first, ForwardIterator last);
// used as:
std::vector<shared_ptr<const Foo> > v;
f(v.begin(), v.end());
这样,函数f
只需要它获取一系列可用作指向const Foo
的指针的东西(或shared_ptr<const Foo>
s,如果函数假定该范围包含 shared_ptr
s)。
当函数采用范围而不是容器时,您将函数与基础数据分离:只要您可以按照需要使用的方式使用它,数据的实际内容或存储方式就不再重要。
vector<TYPE>
和vector<const TYPE>
是两种不同的类型。因此,如果没有黑客或脏代码,这是不可能的。
为什么需要std::vector<shared_ptr<Foo const> >
? 这转换很容易;只需使用两个迭代器构造函数 std::vector
. 但在许多情况下,您不需要它:通常,常量正确性与动态分配无关对象,如果您需要shared_ptr<Foo const>
,则有一个从向量。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中