ホームページ >バックエンド開発 >C++ >C の `std::array` を使用して C スタイルの配列初期化を模倣するにはどうすればよいですか?

C の `std::array` を使用して C スタイルの配列初期化を模倣するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-17 20:23:14604ブラウズ

How Can I Mimic C-Style Array Initialization with `std::array` in C  ?

std::array を使用した C 配列の初期化のエミュレーション

C プログラミングでは、構文 int arr[] = { e1, e2, e3 を使用して配列の初期化を簡略化できます。 , ... }、要素の数は自動的に推測されます。 std::array は C 配列の最新の代替手段を提供しますが、この便利な初期化メソッドがありません。この記事では、std::array を使用してこの動作をエミュレートする手法について説明します。

1 つのアプローチには、可変個引数テンプレート関数が含まれます。

template<class T, class... Tail>
auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)>
{
    std::array<T, 1 + sizeof...(Tail)> a = { head, tail ... };
    return a;
}

この関数は、初期要素の先頭と任意の数の追加要素を受け取ります。尾として。適切なサイズの std::array を作成し、指定された要素で初期化します。たとえば、コード auto a = make_array(1, 2, 3);要素 1、2、および 3 を含む std::array を初期化します。

ただし、このアプローチには制限があります。これは、戻り値のコピーを最適化するコンパイラーの機能に依存しているため、常に信頼できるとは限りません。さらに、C 配列の初期化でサポートされる機能であるネストされた型を初期化することはできません。これらの制限を克服するには、次の改善を検討してください。

  • マクロを使用して構文を簡素化します。
#define ARRAY(...) make_array(__VA_ARGS__)
  • 関数シグネチャ:
template<class T, class... Tail>
auto make_array(std::array<T, Size> head, Tail... tail) -> std::array<T, Size + sizeof...(Tail)>
{
    std::array<T, Size + sizeof...(Tail)> a = { head, tail ... };
    return a;
}

これらの改善を使用して、例に示すように、ネストされた型の初期化が可能になります。

#define ARRAY(...) make_array(__VA_ARGS__)

struct A { int a; int b; };
auto arr = ARRAY(A{1, 2}, A{3, 4});

これらの手法は、std::array を使用して C 配列の初期化をエミュレートするための堅牢なソリューションを提供し、std::array オブジェクトの便利で簡潔な初期化を可能にします。最新の C コード。

以上がC の `std::array` を使用して C スタイルの配列初期化を模倣するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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