unique_ptr拥有的对象的索引运算符

3
我正在开发一个C++项目。我需要将不同的类放入std::vector中。我找到了(在单个向量中使用不同类的对象?),它可以通过创建具有公共类型的类,然后将指针放入向量来实现。在这种情况下,我可以将指针转换为我需要的类型。这对我来说很清楚。
还提到了原则上可以使用智能指针,即std::vector<std::unique_ptr<TMyClass>>而不仅仅是指针。这就是我的问题所在。TMyClass有索引运算符(operator[])。
假设我有std::vector<std::unique_ptr<TMyClass>> A。我尝试像这样访问TMyClass对象的元素:A[0][0]A[0].get()[0](A[0])[0]但是编译时会出错:
[bcc64错误] 类型 'value_type' (即 'std::unique_ptr<.....>') 不提供下标运算符。
我该如何告诉编译器第二个索引与TMyClass对象相关,而不是unique_ptr?如果有人能够解释一下如何在这种情况下访问元素,我将不胜感激。

1
你试过 (*A[0])[0] 吗?独特指针就像一个指针 - 你必须使用解引用运算符 * 来访问它的内容。 - undefined
请包含一个 [mcve]。 - undefined
@Ron:谢谢你的回复。你是指重载std::unique_ptr的运算符吗?但这样可能无法与unique_ptr的数组形式一起使用。 - undefined
2个回答

4
您需要先提取指针。
A[0]  //type: std::unique_ptr<TMyClass>&

然后从指针(pointee)中提取对象。

*A[0] //type: TMyClass&

然后,您可以在此对象上使用重载运算符。

(*A[0])[0] 

谢谢你的回复!这似乎有效。使用(*A[0])[0],我基本上可以访问元素。而且我需要将其转换为另一种类型,(TMyClass2*)(&(*A[0])[0])是一个正确的方法吗?还是有更简单的方法可以做到? - undefined
@Alexander 不要使用C风格的强制类型转换,这会引发问题。(*A[0])[0] 的类型是什么?它如何转换为 TMyClass2 - undefined
@Alexander 至少,我建议在使用 (*A[0])[0] 之前创建一个命名变量(可能是一个引用),否则它很快就会变成一个语法地狱。像这样:auto& myObject = (*A[0])[0]; - undefined
1
@Alexander 那你的操作符就像是 TMyClass& TMyClass::operator[](size_t)?如果你真的需要转换,使用 dynamic_cast<TMyClass2*>(&((*A[0])[0]));,但是将类向下转换为派生类是一个不好的迹象。这暗示着你的设计可能有问题。 - undefined
1
@Alexander 我认为这个答案应该被接受,因为它解决了你所提出的问题。类型转换问题是一个不同的问题。如果你在这里找不到答案,请另外提一个新问题。 - undefined
显示剩余4条评论

1
指针必须被解引用。所以,我猜测是(*A[0])[0] 或者A[0]->[0]。看起来不太好,但这就是指针。

1
你有没有试过A[0]->[0]?如果你想这样做,我建议使用A[0]->operator[](0)代替。;-)(但是(*A[0])[0]看起来更简洁和方便一些。) - undefined
@Yaroslav Fyodorov 感谢您的评论!通过 (*A[0])[0],我基本上可以访问到该元素。然后,我需要将其转换为另一种类型,(TMyClass2*)(&(*A[0])[0]) 是一个正确的方法吗?还是有更简单的方法可以实现这个目的? - undefined
也许我需要重新学习一下C++。它在我没有使用Perl的时候不知怎么被污染了。我知道[0]->[0]看起来不够像C++。 - undefined
@Alexander 我在这里感到困惑。现在突然出现了TMyClass2。谁继承自谁?哪个向量保存指向基类的指针? 根据您最初的问题,我认为您想要执行以下操作:A[0] 访问 shared_ptr 对象 A[0].get() 获取底层指针, (TMyClass2*)A[0].get() 进行强制转换。这是基于 TMyClass2 继承自 TMyClass 的假设。 但是我不确定 TMyClass 的索引运算符与此有何关系。 - undefined
@Alexander 如果你在评论中提到的是正确的,即TMyClass有一个类型为TMyClass2[]的数组,并且TMyClass2 operator[](size_t)是正确的,那么你不能将(*A[0])[0]返回的对象进行强制转换,因为它既不是指针也不是引用。无论如何,类型为TMyClass2[]的数组不可能容纳TMyClass3: TMyClass2类的对象。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接