Использование boost :: bind для создания объекта функции, связывающего ресурс автозапуска "куча" - PullRequest
0 голосов
/ 28 августа 2011

Я пытаюсь использовать boost :: bind для создания объекта функции, а также хочу привязать к нему объект, созданный в HEAP, для вызова с задержкой.Пример кода, как показано ниже:

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/noncopyable.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/typeof/typeof.hpp>
#include <iostream>
using namespace boost;

class CTest : public noncopyable
{
public:
    CTest():mInt(0){ std::cout << "constructor" << std::endl; }
    ~CTest(){ std::cout << "destructor" << std::endl; }
    int mInt;
};

int getM( CTest * t )
{
    return t->mInt;
}

function<int()> makeF()
{
    // create some resource on HEAP, not on STACK.
    // cause the STACK resource will be release after
    // function return.
    BOOST_AUTO( a , make_shared<CTest>() );

    // I want to use bind to create a function call
    // wrap the original function and the resource I create
    // for delay call.
    //
    // I use shared_ptr to auto release the resource when
    // the function object is gone.
    //
    // Compile ERROR!!! 
    // cannot convert parameter 1 from 'boost::shared_ptr<T>' to 'CTest *'
    //
    return bind<int>( getM , a );
}


int main(int argc, char* argv[])
{
    BOOST_AUTO( delayFunc , makeF() );
    delayFunc();
    return 0;
}

Выше приведен только пример кода.Но я думаю, что это показывает, что я хочу, и текущая ошибка:

В настоящее время, я думаю, я могу использовать только объект функции, чтобы обернуть оригинальную функцию, как показано ниже:

class CGetM
{
public:
    typedef int result_type;
    int operator() ( shared_ptr<CTest> t )
    {
        return getM( t.get() );
    }
};

И заменитькод, подобный следующему:

return bind<int>( CGetM() , a );

Однако, если в настоящее время у меня есть много оригинальных функций, таких как getM, для адаптации правильных аргументов обертывание его в объект функции - действительно большая работа.Я не знаю, есть ли какие-то советы или другие полезные классы утилит в надстройке, могут ли они справиться с таким делом более разумно и элегантно?

Так что любые предложения приветствуются.Спасибо.

1 Ответ

0 голосов
/ 28 августа 2011

Вам необходимо использовать связующую композицию:

return bind<int>( getM, bind(&shared_ptr<CTest>::get, a) );
...