std::array
このコンテキストでは、含まれる型 (T) にデフォルトのコンストラクターがない場合、std::array の初期化が困難になる可能性があります。一般的な解決策には、配列を満たすために値を手動で繰り返すことが含まれます。これは、大きな n 値の場合、退屈でエラーが発生しやすいプロセスです。
幸いなことに、シーケンス タイプとカスタムの繰り返し関数の組み合わせを使用する、より洗練されたアプローチが存在します。次のコードを考えてみましょう。
<code class="cpp">template<typename T, int N> void f(T value) { // Generate a sequence of numbers: 0, 1, ..., N-1 using genseq_t = genseq_t<N>; std::array<T, N> items = repeat(value, genseq_t{}); }</code>
genseq_t
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 return {(N, value)...}; }</code>
genseq_t タイプは、push_back 操作を使用して再帰的に定義され、シーケンスを作成します:
<code class="cpp">template<int N> struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>
カスタム シーケンスと繰り返し関数により、柔軟なstd::array
以上がデフォルト以外の構築可能な型の `std::array` をエレガントに初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。