【问题标题】:cast std::list<X> to std::list<Y>将 std::list<X> 转换为 std::list<Y>
【发布时间】:2018-07-19 17:39:07
【问题描述】:

这是我的情况。我有两个班级 X 和 Y。

X 继承自 Y。

class X : public Y

我有一个这样定义的方法:

void getSomethingFromList(std::list<Y> list);

我怎样才能像这样将 X 对象的列表传递给这个方法?

std::list<X> xList;
getSomethingFromList((std::list<Y>)xList);

【问题讨论】:

  • 没有演员可以做到这一点。您可以将std::list&lt;X&gt; 的元素复制到另一个std::list&lt;Y&gt;,但您会体验到对象切片。
  • 不,你不能 - 但你可以有一个unique_ptrs 到你的基础对象的列表。
  • std::list&lt;X&gt;std::list&lt;Y&gt; 是完全不相关的类型。没有简单的方法可以做到这一点。
  • 你不能,你必须复制,但最好改变界面
  • @NathanOliver 那么std::vector 可能会更好,因为在列表中保留指针不是一个好主意。

标签: c++


【解决方案1】:

唯一的方法是使用(唯一的)指针列表,而不是对象本身。显然,这并不理想,但这是我们为虚拟化付出的代价。在你的情况下,

std::list<std::unique_ptr<X>> xList;

【讨论】:

    【解决方案2】:

    静态类型语言对此类操作施加了一些限制以确保类型安全,并且对于 C++ 的情况,您不能简单地这样做(除了将所有元素重新打包到新的 std::list&lt;Y&gt;)如果您 google对于“c++ 容器变体”之类的关键字,您会发现几篇有趣的文章,例如

    所有 C++ 标准库容器都是不变的

    Java 支持协变(除了不变性)

    像 Scala 这样具有高级类型系统的语言实际上允许您进行更多操作(前提是您根据类型系统设计在这里和那里注释参数类型)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2023-03-15
      • 2020-05-27
      • 1970-01-01
      • 2012-12-05
      相关资源
      最近更新 更多