デフォルト以外で構成可能な型を使用した std::array のエレガントな初期化
デフォルト以外の型を使用した std::array の初期化構築可能な要素タイプは面倒な作業になる可能性があります。手動で値を n 回繰り返すことは、n が大きい場合には非効率的でエラーが発生しやすくなります。
この問題に対処するには、シーケンス タイプとジェネレーターを使用する、より洗練されたアプローチが必要です。重要なアイデアは、0 から n-1 までのインデックスのシーケンスを作成し、関数を使用して各インデックスに値を繰り返し適用することです。
実装は次のとおりです。
<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 を初期化します:
<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>
さらに、次の定義が使用されます:
<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> {}; }; 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>
このソリューションは、std::array を初期化する効率的かつ洗練された方法を提供します。 n の値に関係なく、デフォルトで構築できない型を使用します。
以上がデフォルトで構築できない型を使用して std::array をエレガントに初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。