如何全局声明一个可变长度的std :: array并获取其大小(如果它具有std :: string作为成员)

时间:2018-11-17 08:25:20

标签: c++ c++11

在C语言中,我们可以创建如下所示的静态全局数组:

static struct A a1 [] = { 1,2,3,4};

因此我们可以使用以下计算方法确定尺寸

sizeof(a1)/sizeof(a1[0])

如果它包含可变长度值字符串的std :: string,我们如何使用std :: array在C ++中实现相同的目标?

struct A
{
std::string b;
int x;
};

1 个答案:

答案 0 :(得分:3)

首先,您的示例未使用可变长度数组(C ++不具有C具有的可变长度数组功能。C++具有std::vector,这是不同的)。 a1数组的大小为编译时。大小由初始化决定:您指定了4个元素来初始化数组,因此大小为4。

如果您想拥有一个std::array,而无需指定其大小,则可以使用C ++ 17使用类模板参数推导功能来实现:

#include <array>

struct A {
    std::string b;
    int x;
};

std::array a1 = { // template arguments will be deduced
    A{ "a", 1 },
    A{ "abc", 2 }
};

int main() {
    return a1.size(); // will return 2, as a1 has a size of 2
}

不幸的是,使用C ++ 11不能做到这一点。

如果您不必拥有std::array,则可以像您的示例一样进行操作(您可以这样做,因为sizeof(A)是常数,所以大小无关紧要b中的字符串):

struct A {
    std::string b;
    int x;
};

A a1[] = {
    { "a", 1 },
    { "abc", 2 }
};

int main() {
    return sizeof(a1)/sizeof(a1[0]); // returns 2
}