技术文章

了解最新技术文章

当前位置:首页>技术文章>技术文章
全部 146 常见问题 7 技术文章 139

think cell中新的 static constexpr std::integral_constant 习惯用法

时间:2023-11-08   访问量:1034  标签: think cell,think-cell,编译

给定类型的大小std::array<T, N>在编译时已知。但它只提供常规.size()成员函数:

template <typename T, std::size_t N>struct array {
    constexpr std::size_t size() const {
        return N;
    }};
std::array::size

如果您正在编写需要某种编译时大小范围的通用代码,这会很烦人。

template <typename Rng>void algorithm(Rng const& rng) {
    constexpr auto a = Rng::size(); // error, std::array has no static size
    constexpr auto b = rng.size();  // error, not a constant expression
    constexpr auto c = std::tuple_size<Rng>::value; // okay, but ugly}
需要恒定大小的通用代码

std::array::size如果是一个static成员函数,那就太好了:

template <typename T, std::size_t N>struct array {
    static constexpr std::size_t size() {
        return N;
    }};
更好的std::array::size

现在我们可以在::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,因为这是尺寸的“最常量”版本:

template <typename T, std::size_t N>struct array {
    static constexpr std::integral_constant<std::size_t, N> size = {};};
最好std::array::size

现在我们可以编写array::size并获取std::integral_constant代表大小的 a 。但我们已经破坏了所有假设.size()::size()

您可能会这么认为,但事实并非如此:std::integral_constant有一个呼叫接线员!

template <typename T, T Value>struct integral_constant {
    constexpr T operator()() const {
        return Value;
    }};
std::integral_constant::operator()

因此,对于单个成员,我们支持:

现在很好!

C++ 委员会的库发展小组正在考虑对所有具有恒定大小的新标准库组件使用该习惯用法,例如std::simd、 或std::inplace_vector::capacity(以前称为std::static_vector::capacity)。当然,我们实际上无法std::array因为 ABI 或其他原因而改变......


上一篇:think cell中默认情况下不同

下一篇:think cell博客:我们应该停止编写函数吗?

发表评论:

评论记录:

未查询到任何数据!

免费通话

24小时免费咨询

请输入您的联系电话,座机请加区号

免费通话

微信扫一扫

微信联系
返回顶部