如何构造包含联合的结构的 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<message_t>::unique_ptr(message_t::id_e, button_t&)'
谁能帮我找出问题所在?
【问题讨论】:
make_unique 不采用指针类型。您应该将结构的类型传递给 make_unique,即std::make_unique<message_t>
是的,当然,谢谢!
【参考方案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?