C でのコンパイル時の静的配列のプログラムによる作成
C でのコンパイル時に静的配列を作成することは、パフォーマンスを最適化し、データの整合性を確保します。静的配列を定義する 1 つの方法は、次の構文を使用することです。
const std::size_t size = 5; unsigned int list[size] = { 1, 2, 3, 4, 5 };
このアプローチは簡単ですが、配列値を明示的に指定する必要があります。柔軟性を高めるには、さまざまなメタプログラミング手法を使用して、コンパイル時にこれらの値を「プログラム的に」割り当てることが望ましい場合があります。
質問 1: プログラムによる値の割り当て
できますか?メタプログラミング手法を使用して、コンパイル時に「プログラム的に」配列値を割り当てますか?
答え:
はい、C 0x 機能を使用すると、テンプレートのローカル配列またはメンバー配列を初期化できます。可変個引数テンプレート引数リストから。このアプローチはテンプレートのインスタンス化の深さによって制限される可能性がありますが、柔軟性は大幅に向上します。
質問 2: 選択的な値の割り当て
配列はいくつかを除いて同じです。コンパイル時にプログラム的に値を選択的に割り当てることはできますか?
答え:
はい、組み合わせて使用できます。可変長引数テンプレートと関数テンプレートを使用して、特定の値を持つ配列を生成します。たとえば、次のコードについて考えてみましょう。
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... }; template<size_t N, template<size_t> class F, unsigned... args> struct generate_array_impl { typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result; }; template<template<size_t> class F, unsigned... args> struct generate_array_impl<0, F, args...> { typedef ArrayHolder<F<0>::value, args...> result; }; template<size_t N, template<size_t> class F> struct generate_array { typedef typename generate_array_impl<N-1, F>::result result; };
このコードでは、各インデックスの値を決定するテンプレート関数を指定することで、特定の値を持つ配列を作成できます。
例:
値 1 ~ 5 を持つサイズ 5 の配列を作成するには:
template<size_t index> struct MetaFunc { enum { value = index + 1 }; }; void test() { const size_t count = 5; typedef generate_array<count, MetaFunc>::result A; for (size_t i=0; i<count; ++i) std::cout << A::data[i] << "\n"; }
以上がC の静的配列はコンパイル時にプログラムで初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。