首頁 >後端開發 >C++ >如何有效率地實作C 14的`make_integer_sequence`並避免編譯錯誤?

如何有效率地實作C 14的`make_integer_sequence`並避免編譯錯誤?

Patricia Arquette
Patricia Arquette原創
2024-12-28 02:10:14615瀏覽

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

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn