如何在 C++ 模板 class 参数中传递成员数组的初始化值?

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 的各个项目。我的目标是能够按照以下方式定义过滤器对象

Filter<3, 8, 1.0, 0.3678, 0.1353, 0.04978> filter;

其中模板的最后四个非类型参数是成员数组 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...};
};

但这将值嵌入到类型中,这真的是您想要的吗?它将阻止存储这些对象的数组,因为它们现在具有不同的类型。

我建议只使用 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,否则这个可变参数模板会影响其他一些构造函数。