我可以将新值分配/移动到元组内的 unique_ptr 中吗?

Posted

技术标签:

【中文标题】我可以将新值分配/移动到元组内的 unique_ptr 中吗?【英文标题】:Can I assign/move a new value into a unique_ptr inside a tuple? 【发布时间】:2016-07-30 12:37:44 【问题描述】:

之所以需要这样做,是因为我希望run 使用所有其他元组元素。基本上,我有这些元组的向量来形成一种表。我无法弄清楚自己如何正确地做到这一点。

编辑:显然之前的简化代码给出了不同的错误,所以忽略它。这里的代码是我的代码中的代码。 (对不起)

class GUI 
    using win_t = std::tuple<sf::RenderWindow&, Container&, std::unique_ptr<std::thread>, std::condition_variable>;
    enum  WINDOW, CONT, THREAD, CV 

    std::vector<win_t> windows;        

    void run(win_t &win);

    win_t &addWindow(sf::RenderWindow & window, Container & c) 
        windows.emplace_back(std::forward_as_tuple(window, c, nullptr, std::condition_variable()));
        win_t &entry = windows.back();
        std::get<GUI::THREAD>(entry) = std::make_unique<std::thread>(&GUI::run, this, entry); // error is on this line
        return entry;
    

我得到的错误:

Error   C2280   'std::tuple<sf::RenderWindow &,Container &,std::unique_ptr<std::thread,std::default_delete<_Ty>>,std::condition_variable>::tuple(const std::tuple<sf::RenderWindow &,Container &,std::unique_ptr<_Ty,std::default_delete<_Ty>>,std::condition_variable> &)': attempting to reference a deleted function dpomodorivs c:\program files (x86)\microsoft visual studio 14.0\vc\include\tuple    75`

【问题讨论】:

上述方法你试过了吗?出了什么问题? 请提供minimal reproducible example,并附上您遇到的错误。 对不起。现在好点了吗? @snowflake 请注意,此代码甚至与您发布的原始代码都不匹配。 【参考方案1】:

仔细查看您遇到的错误,替换类型:

Error   C2280   'std::tuple<Ts...>::tuple(const std::tuple<Ts...>&)': attempting to reference a deleted function dpomodorivs c:\program files (x86)\microsoft visual studio 14.0\vc\include\tuple    75`

您正在尝试在您的元组上使用复制构造函数,它是不可复制的(由于unique_ptrcondition_variable)。在那条线上,这发生在这里:

std::make_unique<std::thread>(&GUI::run, this, entry)

或者更具体地说,在底层的std::thread 构造函数调用中。 entry 不可复制,但 thread 构造函数在内部复制其所有参数。即使entry 可复制的,这也不是你想要的,因为run() 将被调用并引用thread 的副本而不是特定的entry 你想要。

为此,您需要std::ref():

std::make_unique<std::thread>(&GUI::run, this, std::ref(entry))

【讨论】:

以上是关于我可以将新值分配/移动到元组内的 unique_ptr 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中读取元组内的列表

Python将项目添加到元组

Python Pandas:计算组内的移动平均值

猪:包到元组

将列表作为单个元素插入到元组中

如何将列表(元组内)中的元组转换为列表?