提问人:JHeni 提问时间:11/9/2023 最后编辑:Remy LebeauJHeni 更新时间:11/9/2023 访问量:95
在构造函数中初始化 std::array 成员?
Initilise std::array member in constructor?
问:
我正在寻找一种初始化成员的方法。std::array
构造函数定义数组的大小。此大小在编译时是已知的。
显然,我可以通过模板参数传递数组的大小。
#include <array>
template<size_t x, size_t y>
class MyClass
{
public:
void memberFunction1();
void memberFunction2();
std::array<uint8_t, x*y> m_array;
};
但是,这里的问题是,我需要在所有成员函数中携带模板参数(这使得事情更难阅读)。
有没有办法在/构造函数中初始化数组?所以像这样的东西(虽然我无法让它工作):constexpr
consteval
#include <array>
class MyClass
{
public:
std::array m_arr;
explicit consteval MyClass(const size_t x, const size_t y):
m_arr{uint8_t, x*y}
{
}
};
我没有选择或其他东西,因为我想避免动态内存分配。std::vector
答:
1赞
Red.Wave
11/9/2023
#1
您可以使用 CTAD,但首先需要一些准备工作:
template<std::size_t x, std::size_t y>
struct dims{
constexpr static std::integral_constant<std::size_t, x> width;
constexpr static std::integral_constant<std::size_t, y> height;
}; //dims
接下来,我们可以使用类的构造函数参数:dims
template<std::size_t x, std::size_t y>
class my_class{
public:
constexpr static dims<x,y> size;
constexpr my_class(dims<x,y>)/*ctor definition*/;
private:
/*rest of my_class*/
};
现在 C++20 为我们提供了默认的 CTAD 机制:
my_class my_object{ dims<my_x,my_y>{} };
请注意,对于 CTAD,所有模板参数都必须可从构造函数参数中推导出来。在这个例子中,我们只有维度参数。如果类模板列表中有其他参数,它们也必须以某种方式反映在构造函数参数中。 在 C++17 中,你需要一个 CTAD 指令:
template<std::size_t x, std::size_t y>
myclass(dims<x,y>) -> my_class<x,y>;
评论
1赞
user4581301
11/9/2023
术语:CTAD
0赞
Red.Wave
11/9/2023
构造函数模板参数推导。
1赞
JHeni
11/9/2023
谢谢你的答案。我会尝试使用CTAD:)
评论
consteval
consteval
MyClass(1, 2)
MyClass(2, 3)
constexpr