在给定代码中使用以下结构时编译器究竟创建了什么?
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;
};
我理解调用函数遍历嵌套的numlist结构,直到头匹配事件,但是多少个HandlerCaller结构将被实例化以及有多少个数列?
编译器是否使用不同版本的嵌套numlist创建6个HandlerCaller(5个事件+ nullevent)?或者它只创建一个包含所有嵌套numlist结构的TaskTraits,然后只传递指向HandlerCaller中TaskTraits内部特定numlist的指针(不可能,因为没有TaskTraits的对象,只是结构定义,对吗?)?那么会创建多少个HandlerCaller?只有一个?也许我认为它与正常编程太相似,但所有这些模板似乎有时令人困惑。谢谢你的解释。