我最近遇到了一个旧的C函数,返回一个指向静态数组的指针。我在该函数周围编写了一个包装器,并返回了一个std::unique_ptr
,它使用了一个不可删除的标记来强调返回的指针类型--给用户一个“不要删除我”的警告。下面是一个示例代码
extern "C" int *f(int i);
struct noop
{
template <typename T>
void operator() (T t) const noexcept
{
}
};
class MyClass
{
public:
std::unique_ptr<int, noop> F(int value) const
{
return std::unique_ptr<int, noop>(f(value));
}
};
有没有一种不用定义无删除结构就能做到这一点的更干净的方法?
发布于 2019-04-23 02:26:20
C++编码指南建议使用别名或“虚拟”包装器来表示所有权或非空:
关于它们的实现,请看一下:
https://github.com/Microsoft/GSL/blob/master/include/gsl/pointers
您将看到owner<>
和non_null<>
的示例。
你可以用相似的定义。显然,不能删除不具有所有权的指针;如果只是想要一个提醒,那么
template <class T, class = std::enable_if_t<std::is_pointer<T>::value>>
using non_owner = T;
如果您想要强制执行,请从链接中复制并调整non_null<>
的代码。
https://stackoverflow.com/questions/55752058
复制相似问题