一部のデータに対してフィルタリングを実行したい場合、実行時にこのデータを生成することを回避しながら、これらのフィルターのサイズとデータ分散を変更する柔軟性を維持しながら、クリーンで再利用可能なコードを維持するにはどうすればよいでしょうか。テンプレートを使用して次のようなことができることを知っています。
template <int x> class Filter
{
static const float f;
static const Filter<x-1> next;
inline float* begin(const Filter<x>& el){ return &f; }
inline float* end(const Filter<x>& el) { return (&f)+x+1; }
};
template <> class Filter<0>
{
static const float f;
inline float* begin(const Filter<0>& el){ return &f; }
inline float* end(const Filter<0>& el) { return (&f)+1; }
};
template <int x> const float Filter<x>::f = someDistribution(x);
template <> const float Filter<0>::f = someDistribution(0);
これは確かに someDistribution(...) に従ってフィルター オブジェクトのインデックス x に従って私のフィルターでデータを生成します。しかし、私の使い方にはいくつかの欠点があります...
1)このデータはオブジェクトの構築時に生成されませんが、プログラムの開始時に一度生成されると言っているのは正しいと思います。-これは許容できますが、むしろフィルターがcomiletimeで計算され、その場で焼き付けられます(これはfloatデータでも可能ですか?)
2) 構造体の長さをトラバースするメンバー関数 (どこかで呼び出される!) がない限り、フィルターは「次の」メンバーをインスタンス化しません。
// inside template<int x> class Filter
inline void instantiate() const { next.instantiate(); };
// then inside template<> class Filter<0>
inline void instantiate() const { };
急落するインスタンス化関数を要求するのは間違っているに違いありません。これは、保守が容易な句に失敗します。
編集:ここで気にする理由は、next
メンバーがインスタンス化されていることを確認して、begin 関数と end 関数を使用して静的な「配列」を走査できるようにしたいからです。
まず、問題 2 を修正してインスタンス化関数を廃止するにはどうすればよいでしょうか。次に、問題 1 を修正して、このデータがコンパイル時に動的に生成されてバックインされるようにすることは可能ですか。
(注意: 同様の問題について、Python のプリコンパイル スクリプトを使用してフィルター データを含むソース ファイルを生成しましたが、ここではそれを使用したくありません。これは独自の魚のやかんです!)