我最近遇到了一个旧的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));
}
};
有没有一种更干净的方法来执行此操作而不定义无删除结构?
答案 0 :(得分:7)
[..]旧的C函数,返回指向静态数组的指针。我写 该函数的包装,并返回了一个
std::unique_ptr
不要。返回std::unique_ptr
对呼叫者说:
对于静态数组的指针,这都不是真的!
用原始指针粘住,或使用一些包装器类来允许类似引用的访问。 std::reference_wrapper
还提供例如复制时的原始指针之类的语义。
答案 1 :(得分:0)
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<>
的代码。