Совместное использование boost::bind и boost::signals
От: tilarids Украина tilarids.blogspot.com
Дата: 11.10.08 10:41
Оценка:
Здравствуйте!

У меня возникла небольшая проблема, корней которой я не могу понять. Лучшим описанием будет код:

#include <iostream>
#include <boost/signals.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>

class Func : public boost::noncopyable
{
public:
    void operator()(int i)
    {
        std::cout<<"Func::operator("<< i <<")\n";
    }
};

typedef boost::signal<void ()> signal_type;
Func f;
signal_type::slot_type binded_func = boost::bind<void>(boost::ref(f),42);

int main()
{
    boost::shared_ptr<signal_type> apSig(new signal_type());
    apSig->connect(binded_func);
    (*apSig)();

    apSig.reset(new signal_type());
    boost::signals::connection con = apSig->connect(binded_func);
    std::cout<<"Connected: "<<con.connected()<<" Blocked: "<<con.blocked()<<"\n";
}

Данная программа выводит:

Func::operator(42)
Connected: 0 Blocked: 1


Т.е., после создания нового сигнала попытка сделать для него коннект на такой же слот заканчивается неудачно. Если в качестве слота использовать не boost::bind созданный объект, а простой boost::function, то все работает, как и ожидалось.
Надеюсь, этот вопрос кому-то уже известен, потому что мне не улыбается закапываться еще дальше в исходники boost::signals и boost::bind, к чему неминуемо приведет мое любопытство, если будет неудовлетворено.

Заранее спасибо,
Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.