鉴于我想对某些数据执行过滤,我怎样才能避免在运行时生成这些数据,但要保持更改这些过滤器的大小和数据分布的灵活性,同时还要保持干净整洁的可重用代码。我知道我可以使用模板来执行以下操作:
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计算并在那里烘焙(这甚至可能用于浮点数据吗?)
2)过滤器不会实例化“下一个”成员,除非有一个遍历结构长度的成员函数(在某处被调用!),即
// inside template<int x> class Filter
inline void instantiate() const { next.instantiate(); };
// then inside template<> class Filter<0>
inline void instantiate() const { };
要求插入实例化功能一定是我做错了,这使易于维护的子句失败。
编辑:我在这里关心的原因是我想确保next
成员被实例化,这样我就可以使用开始和结束函数遍历静态“数组”。
因此,首先我如何解决问题 2 并取消实例化函数,其次是否可以解决问题 1,以便在编译时动态生成并备份这些数据。
(注意,在类似的问题上,我使用 python 预编译脚本来生成包含过滤器数据的源文件,但我不想在这里使用它,因为那是它自己的鱼锅!)