如何将变量内容常量用作 std::array 的大小?

How to turn a variable content constant for use it as the size of std::array?

我有一个属于 class 的大小变量。我想将它用作 std::array 的大小,但我无法做到这一点。我找到了一些提到 constexpr 的文章,但到目前为止没有任何用处。你能帮帮我吗?

#include<array>
#include<iostream>

class MyClass{
private:
        int size; //variable I need to copy the content and make it constant.
        void calculateSize(int x){
                size = 2 * x;
        }

public:
        MyClass(){}

        void createArray(int val){

                calculateSize(val);
                std::cout << "the size is: " << size << std::endl;
                std::array<int, size> myArray; // error
        }
};

int main(){

        MyClass c;
        c.createArray(5);
        return 0;
}

错误:

main.cpp: In member function ‘void MyClass::createArray(int)’: main.cpp:20:19: error: use of ‘this’ in a constant expression std::array myArray;

这根本不可能。非静态成员变量不是编译时常量值。模板参数必须是编译时常量。因此,您不能将非静态成员变量用作 std::array.

的大小

如果你想要一个在运行时确定大小的数组,那么你需要动态分配数组。实现这一点的最简单方法是使用 std::vector.

如果你想要一个大小不变的数组,那么你可以为此目的使用编译时常量。这样的值不能是非静态成员变量。

这里的问题是对常量含义的误解。在 C++ 中,std::array 的大小必须恒定,其中常量表示 "the size is known at compile-time." 正如您的 class 所暗示的,size 变量是在运行时计算的。同样,constexpr 关键字只能用于其值在编译时已知且永远不会更改的变量。

所以你有几个选择。

  1. 您可以使用 std::vector 并用大小

    初始化它
    std::vector<int> vec(5); // Initializes a vector of size 5
    
  2. 如果你真的在编译时知道数组的大小,你可以使用constexpr

    constexpr int size = 2 * 10;
    std::array<int, size> arr; // Make an array of size 20
    

作为替代解决方案,使用模板:

template <int _size>
class MyClass{
private:
    // size calculation at compile time
    constexpr static int size = _size * 2; 

public:
    // parameter removed since it's unnecessary
    void createArray(){  
        std::cout << "the size is: " << size << std::endl;
        std::array<int, size> myArray;
    }
};

int main(){
    // pass size as template argument
    MyClass<5> c;
    c.createArray();
    return 0;
}