递归/嵌套结构的Cpp模板

时间:2016-10-07 11:35:09

标签: c++ templates structure metaprogramming

在给定代码中使用以下结构时编译器究竟创建了什么?

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?只有一个?也许我认为它与正常编程太相似,但所有这些模板似乎有时令人困惑。谢谢你的解释。

0 个答案:

没有答案