如何在 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
,否则这个可变参数模板会影响其他一些构造函数。
假设我有以下模板 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
,否则这个可变参数模板会影响其他一些构造函数。