Как динамически обходить статическую структуру ?
От: anonim_44ax  
Дата: 25.08.09 21:14
Оценка:
Есть boost::mpl::vector< ... > с описателями. Описатель это тип, статически описывающий каждый элемент дерева.
Есть два класса
template< class TDescriptorsVector, class TStaticIterator >
class Leaf : public Item { ... };

template< class TVector, class TIterator >
class Container : public Item { ... };

Контейнер может содержать либо другие контейнеры (типа Container< TVector, boost::mpl::next< TIterator >::type > ) либо листья (Leaf< TVector, boost::mpl::next< TIterator >::type >). Причем выбор типа ребенка производится по позиции стат. итератора — если итератор не указывает на последний элемент вектора, значит ребенок контейнер, иначе лист.
Дети в контейнерах содержатся в std::map< Tag, DeducedChildType >, где Tag — фактически уникальный номер элемента дерева, а DeducedChildType — инстанциация шаблона Container либо Leaf в соответствии с правилом выше.
Item — базовый интерфейс, описывающий общий интерфейс для всех элементов дерева.

И все бы хорошо, но вот не могу никак написать итератор, который бы позволял в run-time переходить на нужный уровень дерева и итерироваться по всем элементам этого уровня возвращая тип Item. Могу написать мета-функцию, которая бы вычислила реальный (или точнее конечный по иерархии) тип элемента по статически заданному уровню, т.е. через указание номера уровня во время компиляции (это фактически сводится к boost::mpl::at< TVector, levelNumeber >::type). Но как работать с такой структурой используя динамическую информацию (т.е. получая тот же номер уровня во время исполнения) ума не приложу.
Для главная проблема состоит в том, что каждый уровень состоит из элементов разного типа (с общим интерфейсом, который однако не позволяет переходить на следующий уровень).

Может кто подскажет в какую сторону рыть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.