[英]How to pass initialization values for the member array in C++ template class arguments?
假設我有以下模板 C++ class
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
的各個項目。 我的目標是能夠以下列方式定義過濾器 object
Filter<3, 8, 1.0, 0.3678, 0.1353, 0.04978> filter;
其中模板的最后四個非類型 arguments 是成員數組 filter_coefficients 的初始化值。 它是否存在我如何在 C++ 中做到這一點的方法?
是的,在 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...};
};
但這會將值嵌入到類型中,這真的是您想要的嗎? 它將阻止存儲這些對象的 arrays,因為它們現在具有不同的類型。
我建議只使用constexpr
構造函數。 為什么你仍然需要它們是編譯時的?
帶有constexpr
構造函數的 C++14 變體:
#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};
}
有基本的類型檢查來確保元素是float
,否則這個可變參數模板會影響其他一些構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.