如果我想将一个指针设置为多维C++数组的第一个元素,我可以轻松地完成:
double arr[2][3][4];
double *p;
p = &arr[0][0][0];
如何处理任意等级的数组?可以编写一个接收多维数组引用的函数,示例如下:
template <typename T, unsigned N>
void receive(T (&a)[N]) {}
C++11中的
std::remove_all_extents
类模板可用于获取数组的(最深层)元素类型。这可以帮助使用typename std::remove_all_extents<T>::type *
构造receive
的修改版本的返回类型。但是,该如何创建返回的值呢?以下解决方案使用
reinterpret_cast
。这可能会有效率地执行,但我不喜欢reinterpret_cast
绕过类型系统的方式。template <typename T, unsigned N>
typename std::remove_all_extents<T>::type *
to_ptr1(T (&a)[N]) { return reinterpret_cast<
typename std::remove_all_extents<T>::type *
>(&a); }
或者,以下解决方案使用递归,并且虽然类型系统仍然强大,但递归可能会引入其他指令。
template <typename T> T *to_ptr2(T &a) { return &a; }
template <typename T, unsigned N>
typename std::remove_all_extents<T[N]>::type *
to_ptr2(T(&a)[N]) { return to_ptr2(*(&a[0])); }
如何通用地获取多维数组的第一个元素的地址?是否有零开销的强类型解决方案?
reinterpret_cast
的解决方案中,什么不是强类型?我认为这很好,而且我认为它不会有任何改进。 - jrokstd::rank
。 - Benjamin Lindleyreinterpret_cast
版本没有问题 - 数组保证不具有初始填充。我想知道remove_all_extents
是否已经通过递归模板实现。 - M.Mremove_all_extents
将使用递归实现。在这里,计算的结果是一种类型 - 这必须在编译时完成。 - user2023370