C でデフォルト以外の構成可能な型を扱う場合、特に std::array の初期化が困難になることがあります。配列のサイズがテンプレート パラメーターによって決定される場合。
これに対処するために、シーケンス タイプとジェネレーターの概念を活用する洗練されたアプローチを導入します。
テンプレート メタ関数を使用して、seq と呼ばれるシーケンス タイプを定義します。これは、連続する整数のシーケンスを表します。
<code class="cpp">template<int ... N> struct seq { using type = seq<N...>; static const std::size_t size = sizeof ... (N); template<int I> struct push_back : seq<N..., I> {}; };</code>
このシーケンスを使用して、次を生成するジェネレーター genseq を構築します。長さが増加するシーケンス:
<code class="cpp">template<int N> struct genseq : genseq<N-1>::type::template push_back<N-1> {}; template<> struct genseq<0> : seq<> {}; template<int N> using genseq_t = typename genseq<N>::type;</code>
シーケンスを配置したら、repeat() 関数を定義して、同じ値で初期化された配列を作成します:
<code class="cpp">template<typename T, int...N> auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)> { //unpack N, repeating `value` sizeof...(N) times //note that (X, value) evaluates to value return {(N, value)...}; }</code>
デフォルト以外の構築可能な型の std::array を初期化するには、目的の値と genseq_t
<code class="cpp">template<typename T, int N> void f(T value) { //genseq_t<N> is seq<0,1,...N-1> std::array<T, N>> items = repeat(value, genseq_t<N>{}); }</code>このソリューションは、std::array のエレガントかつ効率的な初期化を保証し、n が大きなテンプレート パラメーターである場合の面倒な手動の繰り返しの必要性を効果的に排除します。
以上がテンプレートのメタプログラミングを使用して、デフォルト以外の構築可能な std::array をエレガントに初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。