在下面的代码中,我将一个可变参数模板拆分为两个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...>>::result
和putLeft<typeList<>,size/2, typeList<SL...>>::rest
时,编译器是否管理了putLeft<typeList<>,size/2, typeList<SL...>>::result
的重复结构,还是再次计算结构?
答案 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)
现代编译器避免重新编译。这有助于缩短编译时间。
较旧的编译器重复编译相同的类型,但这不会影响程序的正确性。他们只是在稍后阶段丢弃了重复项。