C 14 make_integer_sequence>
C 14 make_integer_sequence>C 14 make_integer_sequence 的實作與錯誤分析
簡介簡介
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; };
簡介
template< class T , class N > using make_integer_sequence = typename make_helper<T,N>::type;
簡介
。簡化了建立類別模板integer_sequence。本文討論使用輔助結構和巨集的實現,並探討編譯過程中遇到的錯誤。make_integer_sequence的實作
為了實作 make_integer_sequence,定義了一個輔助結構 make_helper: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>{};
錯誤分析由於虛擬記憶體耗盡,GCC 4.8.0 的編譯最初失敗。當修改巨集 GEN 以產生更大的序列時,會發生此錯誤。原因是該實作需要深度模板實例化,這會耗盡可用記憶體。 減少模板深度實例化要減少深度模板實例化,可以使用-ftemplate-depth 編譯器選項可用於增加最大深度,或者可以使用具有對數複雜度的不同實現Log N實作提供的 log N 實作使用遞歸方法,效率更高:
以上是如何有效率地實作C 14的`make_integer_sequence`並避免編譯錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!