获取没有实例的std :: array的大小

Chr*_*ger 49 c++ c++11 stdarray

鉴于此结构:

struct Foo {
  std::array<int, 8> bar;
};
Run Code Online (Sandbox Code Playgroud)

bar如果我没有实例,如何获取数组元素的数量Foo

Jar*_*d42 81

你可以使用std::tuple_size:

std::tuple_size<decltype(Foo::bar)>::value
Run Code Online (Sandbox Code Playgroud)

  • 在这里挂钩:处理`std :: tuple`s(`std :: tuple_size`,`std :: tuple_element`,`std :: get`)的各种类和函数有一些方便的特殊处理来处理`std :: array <T,N>`就像`std :: tuple <T,T,...,T>`. (15认同)

sky*_*ack 26

尽管@ Jarod42 得到了很好的答案,但这是另一种可能的解决方案,基于decltype它不使用tuple_size.
它遵循一个在C++ 11中工作的最小的工作示例:

#include<array>

struct Foo {
    std::array<int, 8> bar;
};

int main() {
    constexpr std::size_t N = decltype(Foo::bar){}.size();
    static_assert(N == 8, "!");
}
Run Code Online (Sandbox Code Playgroud)

std::array已经有一个名为constexpr的成员函数size,它返回你要查找的值.

  • @Mgetz我没有说它更好.:-) ...不同的解决方案和答案可以帮助未来的读者,无论他们是否是被接受的. (3认同)
  • @Mgetz姓名不是该语言最强大的功能,我同意.我们正在处理一种语言,其中包含一个名为`std :: move`的函数,它不会移动任何东西.还有什么?:-)(注意:只是在开玩笑) (3认同)
  • 所以这和@ waxrat的答案有同样的问题,它需要构造,即使构造**可能是'constexpr`,在这个意义上`std :: tuple_size`是一个更好的答案,因为它不需要任何构造或非`constexpr`情况下的破坏. (2认同)

Wil*_*oat 7

你可以给Foo一个public static constexpr成员.

struct Foo {
 static constexpr std::size_t bar_size = 8;
 std::array<int, bar_size> bar;
}
Run Code Online (Sandbox Code Playgroud)

现在您知道了bar的大小,Foo::bar_size并且bar_size如果Foo有多个相同大小的数组,您可以更灵活地命名为更具描述性的内容.