簡體   English   中英

如何在 C++ 模板 class arguments 中傳遞成員數組的初始化值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM