我有:
std::unordered_set<ui::Button*> _buttons;
std::unordered_set<Sprite*> _sprites;
std::unordered_set<Sprite*> _someOtherSprites;
ui::Button
和Sprite
都继承自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);
}
}
我没有必要这样做。我只是想知道这样的事情是否可能。
答案 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);
}