ホームページ  >  記事  >  バックエンド開発  >  初期化子リストを使用して C メンバー配列を初期化するにはどうすればよいですか?

初期化子リストを使用して C メンバー配列を初期化するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 05:41:02738ブラウズ

How to Initialize a C   Member Array with an Initializer List?

Initializer_list を使用して C 0x メンバー配列を初期化する際の代入エラー

初期化子リストを使用してメンバー配列を初期化しようとしているときに、コンパイラ エラーが発生しました: 代入に互換性のない型があります'std::initializer_list' を 'const int [2]' に変更します。

Variadic Template Constructor を使用した解決策

初期化子リスト コンストラクターではなく、Variadic を選択できますテンプレート コンストラクター:

<code class="cpp">struct Foo {
    int x[2];
    template <typename... Ts>
    Foo(Ts... ts) : x{ts...} {}
};</code>

このアプローチを使用すると、次のように Foo オブジェクトを初期化できます:

<code class="cpp">Foo f1(1, 2);     // OK
Foo f2{1, 2};     // Also OK
Foo f3(42);      // OK; x[1] zero-initialized
Foo f4(1, 2, 3); // Error: too many initializers</code>

非定数メンバー配列を使用した解決策と関数本体での初期化

定数性が必須ではない場合は、コンストラクターでの初期化をスキップした後、関数本体内で配列を初期化できます:

<code class="cpp">struct Foo {
    int x[2]; // or std::array<int, 2> x;
    Foo(std::initializer_list<int> il) {
       std::copy(il.begin(), il.end(), x);
       // or std::copy(il.begin(), il.end(), x.begin());
       // or x.fill(il.begin());
    }
}</code>

ただし、このメソッドには、可変長引数テンプレートが提供するコンパイル時の境界チェックがありません。コンストラクター。

以上が初期化子リストを使用して C メンバー配列を初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。