gpt4 book ai didi

c++ - 检测std::shared_ptr持有原始数组(并获取其大小)

转载 作者:行者123 更新时间:2023-12-02 10:04:00 25 4
gpt4 key购买 nike

我正在(另外)正在研究支持容器等标准类型的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中找到任何能揭示原始数组大小的东西。

我考虑过在 operator[] operator* 上使用检测器习惯用法,但是如果 T是原始数组或不是原始数组,则似乎不需要实现来取消定义它们。

我正在尝试的可能吗?我希望我错过了一些东西,或者我可以使用一些技巧。

我知道我可以强制用户改用 std::shared_ptr<std::array<N,T>>std::shared_ptr<std::vector<T>>,但我只想检查是否有可能支持持有原始数组的智能指针。

最佳答案

您可以通过使用编译时类型特征检查T是否为数组类型来确定shared_ptr是否持有数组类型。它甚至在std中实现。

if constexpr (std::is_array_v<T>)

但是无法获得大小,因为它是动态分配的,并且没有存储在任何地方。

关于c++ - 检测std::shared_ptr持有原始数组(并获取其大小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61145512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com