假設我有以下模板 C 類
template<uint32_t FILTER_ORDER, uint32_t BUFFER_LENGTH>
class Filter {
public:
Filter() {}
private:
float data_buffer[BUFFER_LENGTH];
const float filter_coefficients[FILTER_ORDER 1];
};
我一直在尋找一種方法如何filter_coefficients在編譯時傳遞過濾器的系數,即成員陣列的各個專案。我的目標是能夠以下列方式定義過濾器物件
Filter<3, 8, 1.0, 0.3678, 0.1353, 0.04978> filter;
其中模板的最后四個非型別引數是成員陣列 filter_coefficients 的初始化值。它是否存在我如何在 C 中做到這一點的方法?
uj5u.com熱心網友回復:
是的,在 C 20 中是可能的,在此之前float不允許作為非型別模板引數。
template<uint32_t FILTER_ORDER, uint32_t BUFFER_LENGTH, float...values>
class Filter {
public:
Filter() {}
private:
float data_buffer[BUFFER_LENGTH];
const float filter_coefficients[FILTER_ORDER 1]{values...};
};
但這會將值嵌入到型別中,這真的是您想要的嗎?它將阻止存盤這些物件的陣列,因為它們現在具有不同的型別。
我建議只使用constexpr建構式。為什么你仍然需要它們是編譯時的?
帶有建構式的 C 14 變體constexpr:
#include <cstdint>
#include <array>
template<std::uint32_t FILTER_ORDER, std::uint32_t BUFFER_LENGTH>
class Filter {
public:
Filter() {}
template<typename...Floats,typename=decltype(std::array<float,FILTER_ORDER 1>{std::declval<Floats>()...})>
constexpr Filter(Floats...floats):filter_coefficients{floats...}{}
private:
// Consider using `std::array` here too.
float data_buffer[BUFFER_LENGTH];
const float filter_coefficients[FILTER_ORDER 1];
};
int main(){
Filter<3, 4> filter{1.0f,2.0f,3.0f,1.0f};
}
有基本的型別檢查來確保元素是floats,否則這個可變引數模板會影響其他一些建構式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413482.html
標籤:
上一篇:Java筆記-第四周
