如何继承所有 unique_ptr<T[]> 构造函数?

huangapple go评论131阅读模式
英文:

How can I inherit all the unique_ptr<T[]> constructors?

问题

以下是您提供的代码的翻译:

我正在尝试继承 unique_ptr<T[]>,只是为了添加一个使用 malloc 分配数组并设置一个 const 大小字段的构造函数。

#include <memory>
#include <functional>

using std::function;
using std::unique_ptr;
using std::byte;

template<class _Tp, class _Dp = function<void(_Tp*)>>
class unique_array_ptr : public unique_ptr<_Tp[], _Dp> {
public:
    using unique_ptr<_Tp[], _Dp>::unique_ptr;
    unique_array_ptr(const size_t size) : unique_ptr<_Tp[], _Dp>((_Tp*) malloc(size), free), size(size) {}
    const size_t size;
};

void move() {
    unique_ptr<byte> hello(new byte[5]);
    unique_array_ptr<byte> test = std::move(hello);
}

测试赋值触发了以下错误:

<source>: 在函数‘void move()’中:
<source>:18:44: 错误:请求将非标量类型‘std::unique_ptr<std::byte>’转换为‘unique_array_ptr<std::byte>’
   18 |     unique_array_ptr<byte> test = std::move(hello);
      |                                   ~~~~~~~~~^~~~~~~

在有人建议使用 std::vector 之前,请注意,我正在使用一个 C 库,因此需要能够传递它可以稍后释放的缓冲区。

我尝试使用 using unique_ptr<_Tp[], _Dp>::unique_ptr; 继承构造函数,但似乎有些问题。

更新:

我将代码更改为以下形式,但仍然得到“无法转换”的错误:

unique_ptr<byte[], function<void(byte*)>> hello(new byte[5]);
unique_array_ptr<byte> test = std::move(hello);
英文:

I'm trying to inherit unique_ptr<T[]> just to add a constructor which allocates the array using malloc and sets a const size field.

#include &lt;memory&gt;
#include &lt;functional&gt;

using std::function;
using std::unique_ptr;
using std::byte;


template&lt;class _Tp, class _Dp = function&lt;void(_Tp*)&gt;&gt;
class unique_array_ptr : public unique_ptr&lt;_Tp[], _Dp&gt; {
public:
    using unique_ptr&lt;_Tp[], _Dp&gt;::unique_ptr;
    unique_array_ptr(const size_t size) : unique_ptr&lt;_Tp[], _Dp&gt;((_Tp*) malloc(size), free), size(size) {}
    const size_t size;
};

void move() {
    unique_ptr&lt;byte&gt; hello(new byte[5]);
    unique_array_ptr&lt;byte&gt; test = std::move(hello);
}

The test assignment triggers this error:

&lt;source&gt;: In function &#39;void move()&#39;:
&lt;source&gt;:18:44: error: conversion from &#39;std::remove_reference&lt;std::unique_ptr&lt;std::byte&gt;&amp;&gt;::type&#39; {aka &#39;std::unique_ptr&lt;std::byte&gt;&#39;} to non-scalar type &#39;unique_array_ptr&lt;std::byte&gt;&#39; requested
   18 |     unique_array_ptr&lt;byte&gt; test = std::move(hello);
      |                                   ~~~~~~~~~^~~~~~~

Also before anyone says just use std::vector, I'm working with a C library so I need to be able to pass in buffers that it can free later.

I tried to inherit the constructors with using unique_ptr&lt;_Tp[], _Dp&gt;::unique_ptr; but something isn't working.

Update:

I changed it to this but I still get no viable conversion.

unique_ptr&lt;byte[], function&lt;void(byte*)&gt;&gt; hello(new byte[5]);
unique_array_ptr&lt;byte&gt; test = std::move(hello);

答案1

得分: 2

This isn't a unique_ptr<byte[], function<void(_Tp*)>>, but a unique_ptr<byte, default_delete<byte>>, so no reason why it would be interoperable with your class.

英文:

> unique_ptr&lt;byte&gt; hello(new byte[5]);

This isn't a unique_ptr&lt;byte[], function&lt;void(_Tp*)&gt;&gt;, but a unique_ptr&lt;byte, default_delete&lt;byte&gt;&gt;, so no reason why it would be interoperable with your class.

huangapple
  • 本文由 发表于 2023年3月8日 16:46:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/75670942.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定