ホームページ >バックエンド開発 >C++ >C でデフォルト以外の構築可能な型を使用して `std::array` をエレガントに初期化する方法

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 20:17:011017ブラウズ

 How to Elegantly Initialize `std::array` with Non-Default Constructible Types in C  ?

std::array のエレガントな初期化デフォルト以外の構成可能な型を使用する

C のレルムでは、 std::arrayは、固定サイズの配列を処理する便利な方法を提供します。ただし、配列内の要素を初期化すると、デフォルトのコンストラクターがない型を扱うときに問題が発生します。

次のコード スニペットを考えてみましょう。

<code class="cpp">template<typename T, int N>
void f(T value)
{
    std::array<T, N> items = {value, value, value, value, value};
}</code>

単純ではありますが、手動で値を繰り返すのは面倒になります。 Nが増加します。この問題に対処するための、よりエレガントなアプローチは、C 17 の構造化バインディングと可変個引数テンプレートを活用することです。

シーケンス ジェネレーターと繰り返し関数の利用

このエレガントなアプローチの鍵は解決策は、シーケンス型 seq を生成することにあります。 genseq_t<> を使用するジェネレータ。このシーケンス タイプを使用すると、値と生成されたシーケンスをパラメータとして受け取り、std::array を返す繰り返し関数を定義できます。

実装例

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // genseq_t<N> represents seq<0,1,...N-1>
    std::array<T, N> items = repeat(value, genseq_t<N>{});
}</code>

パターンの詳細

  • genseq_t< ;N>::type は、0 から N-1 までのシーケンス タイプを表します。
  • repeat(value, seq) は次のように評価されます。 std::array

この手法により、std::array の簡潔かつエレガントな初期化が可能になります。 T にデフォルトのコンストラクターがない場合でも。

以上がC でデフォルト以外の構築可能な型を使用して `std::array` をエレガントに初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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