gpt4 book ai didi

c++ - 如何使用多态性将相同的操作应用于具有相同基类的不同对象的 unordered_sets?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:11 26 4
gpt4 key购买 nike

我有:

std::unordered_set<ui::Button*> _buttons;
std::unordered_set<Sprite*> _sprites;
std::unordered_set<Sprite*> _someOtherSprites;

ui::ButtonSprite 都继承自Node

例如,我可以这样做:

for(Node* node : _sprites){
node->setPosition(1,2);
}

for(Node* node : _someOtherSprites){
node->setPosition(1,2);
}

for(Node* node : _buttons){
node->setPosition(1,2);
}

由于我需要对两组执行相同的操作,是否有某种方法可以只使用一组循环来完成此操作?我的意思是将循环内执行的所有代码都放在一个地方,而不是像上面那样在不同的循环中重复它?

我必须在单独的集合中维护 sprite、someOtherSprites 和按钮。

我可以做这样的事情吗:

std::unordered_set<std::unordered_set<Node*>> mySets;
mySets.insert(_buttons);
mySets.insert(_sprites);
mySets.insert(_someOtherSprites);

for(auto mySet : mySets)
for(Node* node : mySet){
node->setPosition(1,2);
}
}

我没有必要这样做。我只是好奇这样的事情是否可能。

最佳答案

更好的选择是使用 unordered_set 指针的列表或 vector ,然后将指针推送到您要修改的集合。由于存储在无序集中的类型不同,但共享一个公共(public)基础,因此您需要将它们组装到一个具有公共(public)基础的容器中,然后才能对所有类型进行操作。

std::vector<Node *> myObjects;
// optional myObjects.reserve(_buttons.size() + _spriites.size() + ...)
for (Node *n: _buttons) myObjects.push_back(n);
for (Node *n: _sprites) myObjects.push_back(n);

然后通过 myObjects 在每个节点上调用您的函数。

或者您可以定义一个 lambda 以在循环中使用。

auto fn = [](Node *n) { n->setPosition(1, 2); }

for (Node *node: _sprites) {
fn(node);
}
for (Node *node: _buttons) {
fn(node);
}

关于c++ - 如何使用多态性将相同的操作应用于具有相同基类的不同对象的 unordered_sets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com