鑑於我想對某些數據執行過濾,我如何避免在運行時生成這些數據,但要保持更改這些過濾器的大小和數據分佈的靈活性,同時還要保留乾淨的可重用代碼。我知道我可以使用模板來完成類似以下內容:如何在編譯時靜態生成浮點數據?
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
成員被實例化,所以我可以使用begin和end函數遍歷靜態'數組'。
所以,首先我該如何解決問題2,並用實例化功能做掉,其次是有可能解決的問題1,使這個數據是在編譯時動態生成和支持。
(NB我在類似的問題上,我使用了python預編譯腳本來生成包含過濾器數據的源文件,但我不想在這裏使用它,因爲這是它自己的水壺!)
我不認爲你的通用'end'函數是合法的。向非數組變量的地址添加多於1應該是非法的。 –
所以這應該是可以的,因爲'float f'應該在內存中都是連續的,這樣你就可以將指針指向第一個並迭代到最後。重要的是,最終迭代器需要可解引用,並且保持指向未初始化內存的指針是合法的。 我同意我可以通過編寫'((float *)(&f))+ x + 1'來更加清楚,但是我覺得使用上面使用的簡短格式更清楚其餘代碼段的含義。感謝您檢查。 – geoff3jones