提问人:maciek 提问时间:5/19/2023 最后编辑:maciek 更新时间:5/20/2023 访问量:78
如何在 C++ 类模板中定义静态 constexpr 二维数组?
How to define a static constexpr 2D array in a C++ class template?
问:
我有一个类模板,它接受另一个类模板和一个作为模板参数。我想创建一个共享的二维数组,所有类实例和方法都可以访问它(这样它就不会绑定到任何特定实例,而是 )。我希望在编译时初始化数组。我真的无法确定它;我一直在尝试各种选项,但总是以错误告终......int
static public
class
例:
template <const unsigned int x, const unsigned int dim>
class Class1<Class2<x>, dim> {
private:
static constexpr int multable[dim][dim] = initializeMultable();
public:
static constexpr const int(*initializeMultable())[dim] {
static int result[dim][dim];
for (unsigned int i = 0; i < dim; ++i) {
for (unsigned int j = 0; j < dim; ++j) {
result[i][j] = i + j // whatever
}
}
return result;
}
在编译时初始化这样一个数组的正确方法是什么?
这个问题仍然悬而未决,正如我在评论中提到的,下面的答案没有编译。
答:
2赞
Artyer
5/19/2023
#1
无法从函数返回 C 数组。请改用:std::array
template <const unsigned int x, const unsigned int dim>
class Class1<Class2<x>, dim> {
private:
static constexpr auto multable = []{
std::array<int[dim], dim> result{};
for (unsigned int i = 0; i < dim; ++i) {
for (unsigned int j = 0; j < dim; ++j) {
result[i][j] = i + j // whatever
}
}
return result;
}();
public:
static constexpr auto initializeMultable() {
return multable;
}
};
评论
0赞
Ben Voigt
5/19/2023
不应声明局部变量。 代码可以修改其生存期受 constexpr 调用限制的变量,但不允许有任何在函数调用结束后仍然存在的副作用。static
constexpr
0赞
maciek
5/19/2023
@Artyer:不起作用,我得到:error: use of undeclared identifier 'initializeMultable' static constexpr auto multable = initializeMultable();
0赞
maciek
5/19/2023
我认为我不能把它放在最后,因为我的类有更多的变量,由常规类方法使用private
1赞
Artyer
5/19/2023
@maciek 以前的错误是因为我刚刚复制了您的问题的代码,将数组替换为 ,但这仍然会遇到问题,因为您根本无法通过调用静态 constexpr 函数来初始化静态 constexpr
数据成员
。将其替换为 lambda,旧的公共函数可以只复制静态数据成员。std::array
initializeMultable
评论
result
不能是 。static