C 14 make_integer_sequence 的实现和错误分析
简介
C 14 别名模板make_integer_sequence 简化了创建类模板integer_sequence。本文讨论使用辅助结构和宏的实现,并探讨编译过程中遇到的错误。
make_integer_sequence的实现
为了实现 make_integer_sequence,定义了一个辅助结构 make_helper:
template< class T, T N, T... I > struct make_helper { typedef typename mpl::if_< T(0) == N, mpl::identity< integer_sequence<T,I...> >, make_helper< T, N-1, N-1,I...> >::type; };
实际执行make_integer_sequence 则变为:
template< class T , class N > using make_integer_sequence = typename make_helper<T,N>::type;
错误分析
由于虚拟内存耗尽,GCC 4.8.0 的编译最初失败。当修改宏 GEN 以生成更大的序列时,会发生此错误。原因是该实现需要深度模板实例化,这会耗尽可用内存。
减少模板深度实例化
要减少深度模板实例化,可以使用-ftemplate-depth 编译器选项可用于增加最大深度,或者可以使用具有对数复杂度的不同实现
Log N 实现
提供的 log N 实现使用递归方法,效率更高:
template<unsigned...> struct seq{ using type = seq; }; template<class S1, class S2> struct concat; template<unsigned... I1, unsigned... I2> struct concat<seq<I1...>, seq<I2...>> : seq<I1..., (sizeof...(I1)+I2)...>{}; template<class S1, class S2> using Concat = Invoke<concat<S1, S2>>; template<unsigned N> struct gen_seq; template<unsigned N> using GenSeq = Invoke<gen_seq<N>>; template<unsigned N> struct gen_seq : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{}; template<> struct gen_seq<0> : seq<>{}; template<> struct gen_seq<1> : seq<0>{};
以上是如何高效实现C 14的`make_integer_sequence`并避免编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!