【发布时间】:2020-04-10 17:29:54
【问题描述】:
我正在开发(又一个)支持标准类型(如容器)的 C++ 序列化库。我特别想支持智能指针。
C++17 引入了对 std::shared_ptr 保存原始数组的支持(它知道在这种情况下调用 delete [])。我需要检测到 shared_ptr 持有一个原始数组,以便我可以相应地对其进行序列化:
template <typename T>
void serialize(Writer& writer, const std::shared_ptr<T> ptr)
{
// Writer has overloaded operator()
if (ptr)
{
if (holdsRawArray(ptr)) // How to implement this???
{
auto arrayWriter = writer.array(); // RAII
auto size = rawArraySize(ptr); // How to get this???
for (std::size_t i=0; i<size; ++i)
arrayWriter(ptr[i]);
}
else
writer(*ptr);
}
else
writer(null);
}
如何确定 C++17 智能指针包含原始数组?此信息在element_type 成员类型定义中被删除(通过std::remove_extent_t)。我在智能指针 API 中也找不到任何可以显示原始数组大小的内容。
我曾考虑在 operator[] 和 operator* 上使用检测器习语,但如果 T 是或不是原始数组,似乎不需要取消定义它们。
我正在尝试的可能吗?我希望我错过了什么,或者我可以使用一些技巧。
我知道我可以强制用户改用 std::shared_ptr<std::array<N,T>> 或 std::shared_ptr<std::vector<T>>,但我只是想检查一下我是否甚至可以支持保存原始数组的智能指针。
【问题讨论】:
-
shared_ptr接口中没有任何内容,为此。 -
“我在智能指针 API 中也找不到任何可以显示原始数组大小的内容。”您不会,因为智能指针无法获取该信息。
-
" 我认为智能指针可以在构造时获取大小信息" 好的,让我们看看
std::shared_ptr<int[]> ptr( new int[10] );告诉我在这种情况下共享 ptr 可以获取值 10 的方式 -
你可以知道
std::shared_ptr<T[N]>的大小,但不能知道std::shared_ptr<T[]>的大小。 -
constructor doc (3-7) 当
T为U[N]或U[]时,有关于参与重载的C++17 注释。
标签: c++ arrays c++17 shared-ptr smart-pointers