首页 > 后端开发 > C++ > 如何高效实现C 14的`make_integer_sequence`并避免编译错误?

如何高效实现C 14的`make_integer_sequence`并避免编译错误?

Patricia Arquette
发布: 2024-12-28 02:10:14
原创
591 人浏览过

How to Efficiently Implement C  14's `make_integer_sequence` and Avoid Compilation Errors?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板