Cpp шаблон рекурсивных / вложенных структур

Что именно создает компилятор, когда в данном коде используется следующая структура?

template<>
struct TaskTraits<task_1>
{
typedef numlist<event_1,
numlist<event_2,
numlist<event_3,
numlist<event_4,
numlist<event_5,
null_numlist> > > > >
events;
};

Структура используется в следующем шаблоне:

template<typename event_manager, size_t NL_H, typename NL_TAIL>
struct HandlerCaller<event_manager, common::numlist<NL_H, NL_TAIL> >
{
static void call(MaskType event)
{
if (event & NL_H)
{
typedef typename event_manager::template EventHandler<NL_H> t_handler;
t_handler::handle();
}
HandlerCaller<event_manager, NL_TAIL>::call(event);
}
};

и это называется из:

HandlerCaller<EventManager<task>, typename TaskTraits<task>::events >::call(event);

Numlist довольно прост и определяется как:

template<size_t H, typename T>
struct numlist
{
enum { head = H };
typedef T tail;
};

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

Создает ли компилятор 6 HandlerCaller (5 событий + nullevent) с разными версиями вложенного numlist? Или он создает только одну TaskTraits со всеми вложенными структурами нумерации внутри, а затем передает только указатели на определенный нумератор внутри TaskTraits в HandlerCaller (невозможно, потому что нет объекта TaskTraits, только определение структуры, верно?)? Сколько HandlerCaller будет создано тогда? Только один? Может быть, я считаю, что это слишком похоже на обычное программирование, но все эти шаблоны иногда сбивают с толку. Спасибо за объяснение.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector