了解最新技术文章
给定类型的大小std::array<T, N>
在编译时已知。但它只提供常规.size()
成员函数:
如果您正在编写需要某种编译时大小范围的通用代码,这会很烦人。
std::array::size
如果是一个static
成员函数,那就太好了:
现在我们可以在::size()
不破坏现有代码的情况下获取数组的大小:您仍然可以使用语法调用static
成员函数.
;foo.static_member(args)
相当于std::remove_cvref_t<decltype(foo)>::static_member(args)
. 有 MISRA 指南反对它,并且有一个 clang-tidy 检查抱怨,但它对于通用代码确实很有用。
然而,有时甚至还Rng::size()
不够。假设我们想要 astd::integral_constant
作为结果,这样我们就可以进行基于类型的元编程。当然,我们可以写std::integral_constant<std::size_t, Rng::size()>{}
,但是需要输入很多内容。如果直接使用它会非常方便std::array
,因为这是尺寸的“最常量”版本:
现在我们可以编写array::size
并获取std::integral_constant
代表大小的 a 。但我们已经破坏了所有假设.size()
或::size()
?
您可能会这么认为,但事实并非如此:std::integral_constant
有一个呼叫接线员!
因此,对于单个成员,我们支持:
array::size
,这会产生一个std::integral_constant
对象。
array::size()
,它调用operator()
并std::integral_constant
返回std::size_t
。
array_obj.size()
,与上面相同并返回 a std::size_t
,就像成员函数一样。
现在很好!
C++ 委员会的库发展小组正在考虑对所有具有恒定大小的新标准库组件使用该习惯用法,例如std::simd
、 或std::inplace_vector::capacity
(以前称为std::static_vector::capacity
)。当然,我们实际上无法std::array
因为 ABI 或其他原因而改变......
24小时免费咨询
请输入您的联系电话,座机请加区号