Здравствуйте у меня есть SceneGraph состоящий из Node:
class Node
{
public:
...
GLvoid addChild(Node* child) noexcept;
GLboolean isExistChildren() const noexcept;
GLvoid childrenForEach(std::function<GLvoid(Node* child)> callback) noexcept;
...
private:
Node* mChild = nullptr;
Node* mNextNode = nullptr;
}
GLvoid Node::addChild(Node* child) noexcept
{
child->mNextNode = mChild;
mChild = child;
}
GLboolean Node::isExistChildren() const noexcept
{
return mChild != nullptr;
}
GLvoid Node::childrenForEach(std::function<GLvoid(Node* child)> callback) noexcept
{
Node* iterator = mChild;
while (iterator)
{
callback(iterator);
iterator = iterator->mNextNode;
}
}
На данный момент обход делается следующим образом и только га один уровень графа от корня:
Node* mRootNode = ...;
if (mRootNode->isExistChildren())
{
mRootNode->childrenForEach([&shader](Node* child)
{
...
});
}
Хотелось бы написать свой кастомный итератор для этого, так не хочу использовать коллбеки, но не знаю как обойтись без ссылки на родительский узел(не хочу занимать лишнюю память под указатель для каждого узла)... Может кто-нибудь подскажет как лучше реализовать обход с минимальным использованием памяти и наибольшей производительностью в данном случае?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей