Как использовать полиморфизм для применения одной и той же операции к unordered_sets с разными объектами, имеющими один и тот же базовый класс? - PullRequest
2 голосов
/ 19 апреля 2019

У меня есть:

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

Поскольку мне нужно выполнять одинаковые операции с обоими наборами, есть ли способ сделать это только с одним набором циклов?Я имею в виду хранение всего кода, который выполняется внутри циклов, в одном месте, вместо того, чтобы повторять его в разных циклах, как описано выше?

Мне нужно хранить спрайты, 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);
    }
}

У меня нет необходимости делать это.Мне просто любопытно, возможно ли что-то подобное.

1 Ответ

1 голос
/ 19 апреля 2019

Лучшим вариантом является использование списка или вектора указателей 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, вызывая вашу функцию на каждом узле.

Или вы можете определить лямбду для использования в ваших циклах.

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

for (Node *node: _sprites) {
    fn(node);
}
for (Node *node: _buttons) {
    fn(node);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...