我想为唯一指针实现 std::end。 问题是我必须得到 N(数组中的元素数)。
1.从模板推导类型
template <typename T, size_t N>
T* end(const unique_ptr<T[N]> &arr)
{
return arr.get() + N;
}
但我收到错误错误:C2893:无法使用 [ _Ty=T [N] ] 特化函数模板 'T *test::end(const std::unique_ptr> &)' 具有以下模板参数:'T =int' 'N=0x00'
看起来不可能推导出N
2.从分配器中获取N。 分配器必须知道 N 才能正确执行 delete[]。 您可以在 this article 中阅读相关内容.有两种方法:
过度分配数组并将 n 放在左边。
使用关联数组,p 为键,n 为值。
问题是如何获得这个大小的跨平台/编译器。
也许有人知道更好的方法或知道如何让它发挥作用?
最佳答案
如果您有一个运行时大小的数组并且您需要知道它的大小而无需手动进行簿记,那么您应该使用 std::vector
.它将为您管理内存和大小。
std::unique_ptr<T[]>
只是原始指针的包装器。您无法仅从指针获取指针指向的 block 的大小。你使用 std::unique_ptr<T[]>
的原因在 T* foo = new T[size]
是 unique_ptr
确保delete[]
当指针超出范围时调用。
关于c++ - std::end for unique_ptr<T[]>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40155569/