【问题标题】:Is it possible to cast the contents of a C++17 stl collection?是否可以转换 C++17 stl 集合的内容?
【发布时间】:2021-10-07 09:29:35
【问题描述】:

我有两个类之间的一对多关系,其中拥有的类可以是多个类型。数据模型要求超类中的关系可以在子类中“插入”。

关系的每一端都是这样的:

weak_ptr<Element> owner;
unordered_set<shared_ptr<Element>> ownedElements;

在超类Element上,有一个函数:

unordered_set<shared_ptr<Element>> ownedElements();

在子类上也有类似的功能:

unordered_set<shared_ptr<SubElement>> ownedSubElements();

ownedSubElements() 的实现中,我想将unordered_set&lt;shared_ptr&lt;Element&gt;&gt; 转换为unordered_set&lt;shared_ptr&lt;SubElement&gt;&gt;

这可能吗?

【问题讨论】:

  • 您认为为什么需要这样做?您尝试实现这一目标的实际目标是什么?
  • 好问题。也许我不应该尝试这样做。我正在尝试实现具有此子集概念的现有模型设计。另一种方法是忽略父关系函数(将它们视为抽象),而只实现叶函数。这可能会导致一些功能损失,但可能不需要它,它确实简化了模型。

标签: c++ stl c++17


【解决方案1】:

类似的东西:

std::unordered_set<std::shared_ptr<SubElement>> subElements;
std::transform(
    ownedElements.begin(), ownedElements.end(),
    std::inserter(subElements, subElements.end()),
    [](std::shared_ptr<Element> elem) {
      return std::static_pointer_cast<SubElement>(elem);
    });

这假设您以某种方式知道ownedElements 中的所有元素实际上都指向SubElement 实例。

【讨论】:

  • 我可以假设ownedElements 是一个特定的子类,所以我认为这会起作用。我希望避免创建一个新的 unordered_set,但这可能是唯一的解决方案,我认为它会起作用。这可能是唯一的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2019-04-28
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多