gpt4 book ai didi

c++ - 有没有办法将 boost 信号和槽与不可复制的对象一起使用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:15 26 4
gpt4 key购买 nike

我想将不可复制的对象传递给 boost 信号。请参阅下面的代码(不编译)。有可能的解决方法吗?

#include <boost/signals2.hpp>
#include <iostream>
#include <memory>

struct MySlot
{
void operator()(std::unique_ptr<int>&& input) const
{
std::cout << "Signaled " << *input.get();
}
};

int main(int argc, char* argv[])
{
boost::signals2::signal<void(std::unique_ptr<int>)> signal;

signal.connect(MySlot());

auto ptr = std::make_unique<int>(20);
signal(std::move(ptr));
}

最佳答案

更新 我误解了这个问题。您不希望处理程序类型本身是不可复制的,而是它们的参数。

答案是:不,signals2 不是移动感知的。

注意 一般情况下,你不应该出现这种情况,因为很多连接可以订阅同一个槽,而你只能从参数中移动一次。很可能,您最好传递一个拷贝/常量引用:

#include <boost/signals2.hpp>
#include <iostream>
#include <memory>

struct MySlot
{
void operator()(std::unique_ptr<int> const& input) const
{
std::cout << "Signaled " << *input.get();
}
};

int main()
{
boost::signals2::signal<void(std::unique_ptr<int> const&)> signal;

signal.connect(MySlot());

auto ptr = std::make_unique<int>(20);
signal(ptr);
}

您可以使用通常的方法:


旧答案:

使用std::refstd::cref

这些包装器透明地转发函数调用运算符。

您有责任确保不可复制的可调用对象的生命周期超过连接的生命周期。

制作你自己的生命周期感知包装器

您可以创建一个可调用对象包装器来存储不可复制的对象并转发函数调用运算符,例如 std::reference_wrapper<>做过。不过这一次,您可以将对象存储为 shared_ptr<>。所以生命周期是自动管理的。

关于c++ - 有没有办法将 boost 信号和槽与不可复制的对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41699386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com