如何在 C++ 类模板中定义静态 constexpr 二维数组?

How to define a static constexpr 2D array in a C++ class template?

提问人:maciek 提问时间:5/19/2023 最后编辑:maciek 更新时间:5/20/2023 访问量:78

问:

我有一个类模板,它接受另一个类模板和一个作为模板参数。我想创建一个共享的二维数组,所有类实例和方法都可以访问它(这样它就不会绑定到任何特定实例,而是 )。我希望在编译时初始化数组。我真的无法确定它;我一直在尝试各种选项,但总是以错误告终......intstatic publicclass

例:

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;
    }

在编译时初始化这样一个数组的正确方法是什么?

这个问题仍然悬而未决,正如我在评论中提到的,下面的答案没有编译。

C++ 数组 OOP 模板

评论

0赞 Ben Voigt 5/19/2023
result不能是 。static
0赞 MatG 5/19/2023
不确定它是否对您有所帮助,但请看一下这个答案

答:

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 调用限制的变量,但不允许有任何在函数调用结束后仍然存在的副作用。staticconstexpr
0赞 Ben Voigt 5/19/2023
请参阅 eel.is/c++draft/expr.const#5.2eel.is/c++draft/expr.const#5.16
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::arrayinitializeMultable