数组的大小是否协变?

tem*_*def 3 c++ arrays polymorphism c++11

有没有办法std::array在数组的大小中多态地使用新类型?也就是说,如果我有一个表格的功能

void DoSomething(std::array<int, 5>& myArray) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

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

std::array<int, 10> arr;
DoSomething(arr);
Run Code Online (Sandbox Code Playgroud)

Imof这在数学上是明确定义的,有没有一种方法来编写std::array这样的数组元素是连续的并且这个代码编译?我能想到的唯一技术是有一些奇怪的模板元程序std::array<T, N+1>继承自std::array<T, N>,但我不相信这会迫使数组元素连续.

Jam*_*lis 5

直?没有.

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

#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_;
};
Run Code Online (Sandbox Code Playgroud)

用作:

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
}
Run Code Online (Sandbox Code Playgroud)

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