在下面的代码中,我将一个可变模板拆分为两个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的重复结构,还是重新计算该结构?
发布于 2015-06-15 21:28:47
是的,编译器只会在您需要result类型名称时实例化一次putLeft<typeList<>,size/2, typeList<SL...>>。
然而,为它取一个别名可能是值得的,这样你就不会在第二行输入它:
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;
};它不会对实际发生的事情产生任何影响,但是您代码的读者会感谢您的。
发布于 2015-06-15 21:44:54
现代编译器避免了重新编译。这有助于缩短编译时间。
较旧的编译器重复地重新编译相同的类型,但这并不影响程序的正确性。他们只是在以后的阶段丢弃了重复的东西。
https://stackoverflow.com/questions/30846349
复制相似问题