デフォルト以外の構築可能な型の `std::array` をエレガントに初期化する方法

Patricia Arquette
リリース: 2024-10-30 09:53:27
オリジナル
596 人が閲覧しました

How to Initialize `std::array` for Non-Default Constructible Types Elegantly?

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 type は 0 から N-1 までの一連の数値を表し、repeat 関数は値とシーケンスを受け取り、その値が入った配列を返します。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート