伝統的に、C の静的配列はコンパイル時に fix- を使用して定義できます。サイズ配列。ただし、特定のシナリオでは、コンパイル時にプログラムによって値を割り当てることが望ましい場合があります。この記事では、このような静的配列の動的な作成を実現するためのメタプログラミング手法について説明します。
C 0x 機能を使用すると、テンプレートのローカル配列またはメンバー配列を初期化できます。可変個引数テンプレート引数リスト。この回避策には、テンプレートのインスタンス化の深さが最大であるため制限があります。
コンパイル時に値を選択的に割り当てるには、可変個引数テンプレートとメタ関数の組み合わせを使用できます。 MetaFunc テンプレートは、インデックスに基づいて一連の値を生成するパラメーター パックとして機能します。 Generate_array テンプレートは、生成された値を使用して、必要なサイズの配列を作成できます。
template<size_t index> struct MetaFunc { enum { value = index + 1 }; }; template<size_t N, template<size_t> class F> struct generate_array { typedef typename generate_array_impl<N-1, F>::result result; }; 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<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
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"; }
この例では、静的サイズ 5 の配列。コンパイル時に値 {1, 2, 3, 4, 5} が割り当てられます。 MetaFunc メタ関数。
以上がC メタプログラミングを使用してコンパイル時の静的配列を動的に作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。