Непосредственно? №
Однако вы можете использовать полиморфизм во время компиляции, чтобы достичь чего-то очень похожего, и вы можете написать справочную оболочку, с которой будет легче работать в коде:
#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
}
(Вам нужно добавить несколько operator[]
перегрузок и тому подобное к ref_array_of_at_least
, и для того, чтобы сделать его правильным, требуется некоторая работа, но это начало, которое демонстрирует возможность того, что вы ищете.)