如何构造包含联合的结构的 unique_ptr?

Posted

技术标签:

【中文标题】如何构造包含联合的结构的 unique_ptr?【英文标题】:How to construct a unique_ptr of a structure that contains an union? 【发布时间】:2017-12-22 10:22:32 【问题描述】:

我正在尝试构建一个 std::unique_ptr 指针,其中包含一个枚举和两个元素的联合,这些元素也是结构:

struct button_t

  std::uint8_t id;
  std::uint16_t status;
;

struct led_t

  std::uint8_t id;
  std::uint16_t status;
;

struct message_t

  enum class id_e : std::uint8_t  button_e, led_e  id;
  union
  
    button_t button;
    led_t led;
  ;

  message_t(message_t::id_e id, const button_t& button) : id(id), button(button) 
  message_t(message_t::id_e id, const led_t& led) : id(id), led(led) 
;

当我尝试使用std::make_unique 构造std::unique_ptr 时,如下所示:

button_t button56, 78;
typedef std::unique_ptr<message_t> p_msg_t;
auto msg = std::make_unique<p_msg_t>(message_t::id_e::button_event, button);

我收到以下编译错误:

error: no matching function for call to 'std::unique_ptr&lt;message_t&gt;::unique_ptr(message_t::id_e, button_t&amp;)'

谁能帮我找出问题所在?

【问题讨论】:

make_unique 不采用指针类型。您应该将结构的类型传递给 make_unique,即std::make_unique&lt;message_t&gt; 是的,当然,谢谢! 【参考方案1】:

问题已在 cmets 中得到解答。但请注意,您可以避免多余的“类型”参数,因为您可以从传递给构造函数的 io 对象推断它:

#include <cstdint>
#include <memory>

struct button_t

  std::uint8_t id;
  std::uint8_t status;
;

struct led_t

  std::uint8_t id;
  std::uint16_t status;
;

struct message_t

  enum class id_e : std::uint8_t  button_e, led_e  id;
  union
  
    button_t button;
    led_t led;
  ;

  explicit message_t(const button_t& button) 
  : id(message_t::id_e::button_e)
  , button(button)
  
  

  explicit message_t(const led_t& led) 
  : id(message_t::id_e::led_e)
  , led(led)
  
  

;


int main()

    button_t button56, 78;
    auto msg = std::make_unique<message_t>(button);
    msg = std::make_unique<message_t>(led_t  43, 12 );

【讨论】:

这些演员应该明确吗?向 1 arg ctors 提问总是一个好问题。 (这里的答案可能是no) @Yakk 番茄,tomAto 不是吗?在这种情况下,我们谈论的是具体的东西,比如我们可能不想推断的按钮。将弹出开关误认为是“安全带锁定”灯会很可惜,所以可能是的。

以上是关于如何构造包含联合的结构的 unique_ptr?的主要内容,如果未能解决你的问题,请参考以下文章

c++新特性11 (10)shared_ptr六”构造函数unique_ptr参数“

包含使用 unique_ptr 的 char 数组的 C++ 对象

如何在构造函数中使用删除器初始化 std::unique_ptr?

如何在构造函数中为成员 unique_ptr 赋予默认值? [复制]

《C语言杂记》C语言结构体和联合体详解

如何使用包含联合的结构参数调用外部方法[重复]