C でコンパイル時に静的配列をプログラム的に生成する
C でコンパイル時に静的配列を定義できるとすると、次のことが可能ですか?メタプログラミングを使用してプログラム的に値を割り当てるテクニック?
質問 1: 配列値のプログラムによる割り当て
はい、C 0x 機能を使用すると、コンパイル時に配列要素を「プログラム的に」初期化することが可能です。次の例を考えてみましょう。
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
質問 2: 配列値の選択的な割り当て
配列に一部の例外を除いて繰り返し値が含まれていると仮定すると、選択的に割り当てることが可能です。プログラムによる値:
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; };
ゼロが繰り返される配列の使用法要素 2 と 3 を除く:
template<size_t index> struct MetaFunc { enum { value = index == 2 || index == 3 ? index + 1 : 0 }; }; void test() { const size_t count = 7; typedef generate_array<count, MetaFunc>::result A; for (size_t i=0; i<count; ++i) std::cout << A::data[i] << "\n"; }
これらのソリューションはテンプレートのインスタンス化の最大深さによって制限されますが、プログラムによる配列の作成と初期化に対する C 0x の可能性を示しています。
以上がC 0x メタプログラミング手法を使用して、コンパイル時に静的配列にプログラムで値を割り当てることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。