Что именно создает компилятор, когда в данном коде используется следующая структура?
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 будет создано тогда? Только один? Может быть, я считаю, что это слишком похоже на обычное программирование, но все эти шаблоны иногда сбивают с толку. Спасибо за объяснение.
Задача ещё не решена.
Других решений пока нет …