如何使用多态将相同的操作应用于具有相同基类的不同对象的unordered_set?

时间:2019-04-19 04:24:44

标签: c++ c++11

我有:

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);
}

由于我需要在两个集合上执行相同的操作,因此仅使用一组循环是否可以通过某种方式做到这一点?我的意思是将所有在循环中执行的代码都放在一个地方,而不是像上面那样在不同的循环中重复执行?

我必须将精灵,一些其他精灵和按钮保留在单独的集中。

我可以做这样的事情吗?

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);
    }
}

我没有必要这样做。我只是想知道这样的事情是否可能。

1 个答案:

答案 0 :(得分:1)

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

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);
}