有没有办法在数组的大小中多态地使用新的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 []重载等,并且它需要一些工作才能使它成为正确的,但它是一个开始,展示了你正在寻找的东西的可能性.)