我想将对象列表存储在std::vector
,但对象包含引用且无法分配给。但是,我可以复制构造该对象。
我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针,但这样做的语法会显着降低可读性,特别是在使用迭代器时,我更喜欢另一种选择。
不起作用:
std::vector<MyObject> myVector;
//fill the vector
//...
myVector[1] = object1;
智能指针牺牲了可读性:
std::vector<std::unique_ptr<MyObject>> ptrVector;
//fill the vector
//...
ptrVector[1] = std::unique_ptr<MyObject>(new MyObject(object1));
是否有其他方法可以在对象中使用不可分配的对象std::vector
?
这不是您问题的直接答案,因为我无法提供替代品std::vector
,或者使用它的不同方式,让您可以做您需要做的事情。
但是,如果可以修改定义MyObject
,可能是一个更改它的选项,因此它使用std::reference_wrapper
而不是传统的参考。那将允许MyObject
可分配。
Example:
#include <vector>
#include <functional>
#include <iostream>
struct MyObject
{
//int &_i;
std::reference_wrapper<int> _i;
MyObject(int &i):_i(i) {}
};
int main() {
std::vector<MyObject> vec;
int i1 = 3;
int i2 = 4;
MyObject c1(i1);
MyObject c2(i2);
/* Storing object. */
vec.push_back(c1);
/* Assigning to it. */
vec[0] = c2;
/* Confirming that it's the correct object now. */
for (const MyObject &it : vec)
std::cout << it._i << std::endl;
/* Modifying the value of its internal reference. */
vec[0]._i.get() = 5;
/* Confirming that the original int changed value indeed. */
std::cout << "i2 == " << i2 << std::endl;
return 0;
}
Caveat:现有代码可能已经包含对引用成员的直接赋值(即调用的成员)_i
在上面的代码中)。这些赋值的目的是更改引用所引用的对象的值。将参考替换为std::reference_wrapper
,所有直接分配_i = x
必须替换为_i.get() = x
,否则程序的语义会完全改变。
(编辑)如果使用的引用是常量引用const T&
, a std::reference_wrapper<const T>
可以使用。使用上面的例子,定义MyObject
然后更改为:
struct MyObject
{
std::reference_wrapper<const int> _i;
MyObject(const int &i):_i(i) {}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)