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