Вопрос C ++: boost :: bind получить другой boost :: bind - PullRequest
1 голос
/ 01 июня 2010

Я хочу, чтобы этот код работал правильно, что мне делать?

выдача этой ошибки в последней строке.

что я делаю не так? я знаю, что boost :: bind нужен тип, но я не получаю. помощь

class A
{

public:

    template <class Handle>
    void bindA(Handle h)
    {
        h(1, 2);
    }
};

class B
{

    public:
        void bindB(int number, int number2)
        {
            std::cout << "1 " << number << "2 " << number2 << std::endl;
        }
};


template < class Han > struct Wrap_
{

    Wrap_(Han h) : h_(h) {}

    template<typename Arg1, typename Arg2> void operator()(Arg1 arg1, Arg2 arg2)
    {
        h_(arg1, arg2);
    }
    Han h_;
};

template< class Handler >

    inline Wrap_<Handler> make(Handler h)
    {
        return Wrap_<Handler> (h);
    }
int main()
{

    A a;
    B b;
    ((boost::bind)(&B::bindB, b, _1, _2))(1, 2);
    ((boost::bind)(&A::bindA, a, make(boost::bind(&B::bindB, b, _1, _2))))();
/*i want compiled success and execute success this code*/

}

1 Ответ

1 голос
/ 01 июня 2010

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь связать шаблонную функцию. В этом случае вам нужно указать тип шаблона метода, который вы вызываете для привязки.

Это происходит для метода A::bindA. Ниже приведен фрагмент кода для main, который правильно компилируется с предоставленными классами.

Между прочим, в примере я использую boost :: function (дочерняя библиотека для привязки), чтобы указать, какой тип указателей на функцию используется. Я думаю, что это делает его намного более читабельным и очень рекомендую вам ознакомиться с ним, если вы собираетесь продолжать использовать bind.

#include "boost/bind.hpp"
#include "boost/function.hpp"

int main(int c, char** argv)
{
  A a;
  B b;

  typedef boost::function<void(int, int)> BFunc;
  typedef boost::function<void(BFunc)> AFunc;
  BFunc bFunc( boost::bind(&B::bindB, b, _1, _2) );
  AFunc aFunc( boost::bind(&A::bindA<BFunc>, a, make(bFunc)) );

  bFunc(1,2);
}
...