加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 数组的大小是否协变?

发布时间:2020-12-16 09:31:47 所属栏目:百科 来源:网络整理
导读:有没有办法在数组的大小中多态地使用新的std :: array类型?也就是说,如果我有一个表格的功能 void DoSomething(std::arrayint,5 myArray) { /* ... */} 那么它在数学上是如何明确定义的(即使它不是合法的C代码?) std::arrayint,10 arr;DoSomething(arr); I
有没有办法在数组的大小中多态地使用新的std :: array类型?也就是说,如果我有一个表格的功能

void DoSomething(std::array<int,5>& myArray) {
    /* ... */
}

那么它在数学上是如何明确定义的(即使它不是合法的C代码?)

std::array<int,10> arr;
DoSomething(arr);

Imof这在数学上是定义良好的,有没有办法编写std :: array,使其数组元素是连续的,这个代码编译?我能想到的唯一技术是有一些奇怪的模板元程序,其中std :: array< T,N 1>继承自std :: array< T,N>,但我不相信强制数组元素是连续的.

解决方法

直?没有.

但是,您可以使用编译时多态来实现非常相似的东西,并且您可以编写一个引用包装器,以便在代码中更容易使用:

#include <array>
#include <cstddef>

template <typename T,std::size_t N>
struct ref_array_of_at_least
{
    template <std::size_t M>
    ref_array_of_at_least(T (&a)[M])
        : data_(a)
    {
        static_assert(M >= N,"Invalid size");
    }

    template <std::size_t M>
    ref_array_of_at_least(std::array<T,M>& a)
        : data_(&a[0])
    {
        static_assert(M >= N,"Invalid size");
    }

    T* data_;
};

用作:

void f(ref_array_of_at_least<int,5>) { }

int main()
{
    std::array<int,5> x;
    std::array<int,6> y;
    std::array<int,4> z;
    f(x); // ok
    f(y); // ok
    f(z); // fail
}

(你需要在ref_array_of_at_least中添加一些operator []重载等,并且它需要一些工作才能使它成为正确的,但它是一个开始,展示了你正在寻找的东西的可能性.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读