1

我想将多维数组的大小定义为常量。请问最好的方法是什么?在下面的示例中,MY_CONSTANT 将等于 2。这个常数可以在运行之前确定吗?

#define MY_CONSTANT <what goes here?>

std::string myArray[][3] = { 
{"test", "test", "test"},
{"test", "test", "test"}
};
4

3 回答 3

10

您可以使用std::extent在编译时获取数组的大小:

std::string myArray[][3] = { 
  {"test", "test", "test"},
  {"test", "test", "test"}
};

const std::size_t myArraySize = std::extent<decltype(myArray)>::value;

预处理器将无法直接定义该值。当然你可以使用

#define MY_CONSTANT std::extent<decltype(myArray)>::value

但我想这不是你真正想要做的。

于 2013-10-09T16:56:28.150 回答
3

在 C++11 中,您可以使用constexpr函数来初始化编译时常量:

template <typename T, size_t N> 
constexpr size_t array_size(T(&)[N]) {return N;}

constexpr size_t MY_CONSTANT = array_size(myArray);

(或std::extent作为另一个答案建议使用;我不知道)。

从历史上看,你需要用一个常量表达式来初始化它,比如

const size_t MY_CONSTANT = sizeof(myArray) / sizeof(myArray[0]);
于 2013-10-09T16:59:01.330 回答
1

您正在使用 C++,最好使用const而不是#define.

#define是一个预处理器指令,它将在编译之前执行文本替换。

const int创建一个只读变量。所以最好使用类似的东西:const size_t arraySize = 2;

“这个常数可以在运行前确定吗?”

您将不得不使用动态分配的数组new 或更好地使用vectorSTL

于 2013-10-09T16:56:14.933 回答