Как динамически обходить статическую структуру ?
От: 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). Но как работать с такой структурой используя динамическую информацию (т.е. получая тот же номер уровня во время исполнения) ума не приложу.
Для главная проблема состоит в том, что каждый уровень состоит из элементов разного типа (с общим интерфейсом, который однако не позволяет переходить на следующий уровень).

Может кто подскажет в какую сторону рыть?
Re: Как динамически обходить статическую структуру ?
От: Sni4ok  
Дата: 25.08.09 21:57
Оценка:
Здравствуйте, anonim_44ax, Вы писали:

_>Может кто подскажет в какую сторону рыть?


в сторору mpl::for_each
Re: Как динамически обходить статическую структуру ?
От: Erop Россия  
Дата: 25.08.09 22:00
Оценка: 4 (1)
Здравствуйте, anonim_44ax, Вы писали:


_>Для главная проблема состоит в том, что каждый уровень состоит из элементов разного типа (с общим интерфейсом, который однако не позволяет переходить на следующий уровень).


_>Может кто подскажет в какую сторону рыть?


А как ты собираешься динамически представлять тип?

Можно, например, в каждом узле завести статическое поле или метод, которые позволяют проитерировать аналогичные данные детей в RT... Ну и на этом написать итератор...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Как динамически обходить статическую структуру ?
От: jazzer Россия Skype: enerjazzer
Дата: 26.08.09 01:37
Оценка:
Здравствуйте, anonim_44ax, Вы писали:

_>Может кто подскажет в какую сторону рыть?


посмотри на Boost.Fusion, может, там есть то, что тебе надо — у них алгоритмы одновременно и в рантайме, и во время компиляции работают
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Как динамически обходить статическую структуру ?
От: anonim_44ax  
Дата: 26.08.09 07:20
Оценка:
Спасибо! Это вроде то, что нужно.
Блин, я целый день на это угрохал, а сам так и не допер.
Re[3]: Как динамически обходить статическую структуру ?
От: Erop Россия  
Дата: 26.08.09 07:35
Оценка:
Здравствуйте, anonim_44ax, Вы писали:

_>Спасибо! Это вроде то, что нужно.

_>Блин, я целый день на это угрохал, а сам так и не допер.

Всегда пожалуйста
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.