编译器是否管理使用模板元编程生成的重复类型

时间:2015-06-15 13:23:28

标签: c++ templates template-meta-programming

在下面的代码中,我将一个可变参数模板拆分为两个typeList,typeList和putLeft的定义并不重要。

template<typename ...SL>
struct split {
    static const size_t size = sizeof...(SL);
    typedef typename putLeft<typeList<>,size/2, typeList<SL...>>::result firstHalf;
    typedef typename putLeft<typeList<>,size/2, typeList<SL...>>::rest secondHalf;
};

我想知道的是,当我稍后使用putLeft<typeList<>,size/2, typeList<SL...>>::resultputLeft<typeList<>,size/2, typeList<SL...>>::rest时,编译器是否管理了putLeft<typeList<>,size/2, typeList<SL...>>::result的重复结构,还是再次计算结构?

2 个答案:

答案 0 :(得分:2)

是的,编译器只会在您需要putLeft<typeList<>,size/2, typeList<SL...>>类型名称的位置实例化result一次。

然而,它可能值得为它做一个别名,这样你就不会在第二行输错:

template<typename ...SL>
struct split {
    static const size_t size = sizeof...(SL);
    using impl = putLeft<typeList<>,size/2, typeList<SL...>>;

    using firstHalf = typename impl::result;
    using secondHalf = typename impl::rest;
};

它对实际发生的事情没有任何影响,但代码的读者会感谢你。

答案 1 :(得分:1)

现代编译器避免重新编译。这有助于缩短编译时间。

较旧的编译器重复编译相同的类型,但这不会影响程序的正确性。他们只是在稍后阶段丢弃了重复项。