c++ - 检测 std::shared_ptr 是否持有原始数组(并获取其大小)
问题描述
我正在开发(又一个)支持标准类型(如容器)的 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
成员 typedef 中删除(通过std::remove_extent_t
)。我在智能指针 API 中也找不到任何可以显示原始数组大小的东西。
我考虑过在 and 上使用检测器习语operator[]
,但如果是或不是原始数组operator*
,似乎不需要实现来取消定义它们。T
我正在尝试的甚至可能吗?我希望我错过了一些东西,或者我可以使用一些技巧。
我知道我可以强制用户使用std::shared_ptr<std::array<N,T>>
orstd::shared_ptr<std::vector<T>>
代替,但我只想检查我是否有可能支持保存原始数组的智能指针。
解决方案
您可以shared_ptr
通过使用编译时类型特征检查 T 是否为数组类型来确定是否包含数组类型。它甚至在标准中实现。
if constexpr (std::is_array_v<T>)
但是没有办法获得大小,因为它是动态分配的,而不是存储在任何地方。
推荐阅读
- android - 我应该为 consts 创建一个新文件吗?
- c# - 如何使用 C# 控制台应用程序、dotnetzip 库解压缩文件
- python-3.x - 如何在 python 3.0 中修复这种类型的错误?每当我使用传递参数(dict {})时,它都会显示这种类型的错误“NameError:名称'P'未定义”
- sql-server - 在应用程序运行期间识别受影响的表 - SQL Server 2012
- flutter - 无限像素溢出的颤动底部
- gitea - Gitea Docker windows - 致命:身份验证失败
- python - 如何在 Python 中获得近似的浮点值?
- c# - Adding data to db that comes from DTOs
- django - Need to get user lists along Average in django while data in separate table
- java - 当我在 Windows cmd 中按下 BackSpace 按钮时,Jshell 崩溃