Я пытаюсь использовать 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, для адаптации правильных аргументов обертывание его в объект функции - действительно большая работа.Я не знаю, есть ли какие-то советы или другие полезные классы утилит в надстройке, могут ли они справиться с таким делом более разумно и элегантно?
Так что любые предложения приветствуются.Спасибо.