Как скопировать слоты сигнала буста

Есть ли способ подключить слоты к сигналу? т.е. я хочу скопировать слоты сигнала из одного экземпляра класса в другой

У меня есть сигнал в моем классе и сталкиваюсь со следующей ошибкой. Вероятно, это связано с тем, что этот класс используется в контейнерах STL.

1>c:\boost_1_52_0\boost\signals\detail\signal_base.hpp(150): error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
1>          c:\boost_1_52_0\boost\noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable'
1>          c:\boost_1_52_0\boost\noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable'
1>          This diagnostic occurred in the compiler generated function 'boost::signals::detail::signal_base::signal_base(const boost::signals::detail::signal_base &)'
1>  test.cpp

Итак, я решил поместить конструктор копирования и подключить сигнал к слотам сигнала параметра, а затем я получаю следующую ошибку,

1>d:\workarea\boostsignalsEx\test.h(26): error C2663: 'boost::signal1<R,T1>::connect' : 2 overloads have no legal conversion for 'this' pointer
1>          with
1>          [
1>              R=void,
1>              T1=int
1>          ]

Если я удаляю квалификатор const для параметра конструктора копирования, я получаю еще одну ошибку ..

1>d:\workarea\boostsignalsEx\test.h(40): error C2558: class 'test' : no copy constructor available or copy constructor is declared 'explicit'

Это пример кода, над которым я работаю

class test{
public:
boost::signal1<void, int> sig;
test(const test& t) { t.sig.connect(sig);};
void attach(boost::function1<void, int> f) {sig.connect(f);}
};

думаю, цепочка сигналов не будет работать, потому что я не уверен, будет ли объект параметра конструктора копирования жить «этот» объект

0

Решение

Вы просто подключаете сигнал к новой цели:

Видеть это Жить на Колиру

#include <boost/signals2.hpp>

typedef void(Sigature)(int);
typedef boost::signals2::signal<Sigature> Signal;
typedef Signal::slot_type                 SlotType;

class test{
public:
Signal sig;

test() = default;
test(const test& other) { *this = other; };

test& operator=(test const& other) { sig.connect(other.sig); return *this; }

void attach(SlotType const& f)   { sig.connect(f); }
void trigger(int i) const        { sig(i); }
};

int main()
{
test a, b;
a.attach([](int i) { std::cout << "subscribed to a:      " << i << "\n"; });
a.attach([](int i) { std::cout << "also subscribed to a: " << i << "\n"; });

std::cout << "Trigger via a:\n";
a.trigger(42);

b = a;

std::cout << "\nNow via b:\n";
b.trigger(43);
}

Печать

Trigger via a:
subscribed to a:      42
also subscribed to a: 42

Now via b:
subscribed to a:      43
also subscribed to a: 43
3

Другие решения

Boost-сигналы не являются копируемыми по своей конструкции и поэтому не могут использоваться в контейнерах STL. вместо этого можно использовать указатели на сигналы Блог.

Сигналы сделаны подвижными, что может использоваться в контейнерах c ++ 11.

1

По вопросам рекламы [email protected]