有没有办法使用新的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[]
重载等,并且需要一些工作才能使其 const 正确,但这是一个开始展示了你所寻求的可能性。)
关于c++ - 数组的大小是否协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4731695/