如何将变量内容常量用作 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
关键字只能用于其值在编译时已知且永远不会更改的变量。
所以你有几个选择。
您可以使用 std::vector
并用大小
初始化它
std::vector<int> vec(5); // Initializes a vector of size 5
如果你真的在编译时知道数组的大小,你可以使用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;
}
我有一个属于 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
关键字只能用于其值在编译时已知且永远不会更改的变量。
所以你有几个选择。
您可以使用
初始化它std::vector
并用大小std::vector<int> vec(5); // Initializes a vector of size 5
如果你真的在编译时知道数组的大小,你可以使用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;
}