C++ 有没有办法将boost信号和插槽用于不可复制的对象?

C++ 有没有办法将boost信号和插槽用于不可复制的对象?,c++,boost,C++,Boost,我想把一个不可复制的对象传递给一个增强信号。请参阅下面的代码(不编译)。有可能的解决办法吗 #include <boost/signals2.hpp> #include <iostream> #include <memory> struct MySlot { void operator()(std::unique_ptr<int>&& input) const { std::cout << "Signa

我想把一个不可复制的对象传递给一个增强信号。请参阅下面的代码(不编译)。有可能的解决办法吗

#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));
}
#包括
#包括
#包括
结构MySlot
{
void运算符()(std::unique_ptr&&input)常量
{

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

答案是:不,信号2没有移动感知

注意一般情况下,您不应该出现这种情况,因为许多连接可以订阅同一个插槽,并且您只能从参数中移动一次。在所有情况下,最好传递副本/常量引用:

#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);
}
#包括
#包括
#包括
结构MySlot
{
void运算符()(std::unique_ptr const&input)const
{

是的。有可能将多个插槽连接到一个信号。我完全忘记了。谢谢你的回答。