作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在(另外)正在研究支持容器等标准类型的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);
}
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/
我是一名优秀的程序员,十分优秀!