2012-04-04 3 views
3

Исходя из этого вопросаНеприятности с помощью наддува :: BIND & повысить функцию ::

How to pass class member functions to a method in a 3rd party library?

Краткое резюме мне нужно передавать указатели на функции в конструктор класса называется moveset в 3 партия библиотека с определением

template <class Space> 
moveset<Space>::moveset(particle<Space> (*pfInit)(rng*), 
      void (*pfNewMoves)(long, particle<Space> &,rng*), 
      int (*pfNewMCMC)(long,particle<Space> &,rng*)) 

примеров, приведенных в библиотеке просто определить глобальные функции для pfInit и т.д., пусть их называют F, G и Н. Затем вызовите smc :: moveet Moveset (f, g, h) из класса контроллера;

Я попытался реализовать предложение, используя boost: bind. К сожалению, я изо всех сил пытаюсь заставить это работать.

class IK_PFWrapper 
{ 
public: 

IK_PFWrapper(Skeleton* skeleton, PFSettings* pfSettings) ; 
smc::particle<cv_state> fInitialise(smc::rng *pRng); 

... 
} ; 

в классе контроллера

IK_PFWrapper testWrapper (skeleton_,pfSettings_); 
boost::function<smc::particle<cv_state> (smc::rng *)> f = boost::bind(&IK_PFWrapper::fInitialise, &testWrapper,_1) ; 

// the 2nd and 3rd argument will be eventually be defined in the same manner as the 1st 
smc::moveset<cv_state> Moveset(f, NULL, NULL); 

Полученный ошибка компилятор,

Algorithms\IK_PFController.cpp(88): error C2664: 'smc::moveset<Space>::moveset(smc::particle<Space> (__cdecl *)(smc::rng *),void (__cdecl *)(long,smc::particle<Space> &,smc::rng *),int (__cdecl *)(long,smc::particle<Space> &,smc::rng *))' : cannot convert parameter 1 from 'boost::function<Signature>' to 'smc::particle<Space> (__cdecl *)(smc::rng *)' 
with 
[ 
Space=cv_state 
] 
and 
[ 
Signature=smc::particle<cv_state> (smc::rng *) 
] 
and 
[ 
Space=cv_state 
] 
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

Любая помощь ценится

ответ

0

См demote boost::function to a plain function pointer.

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

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

template <class Space> 
moveset<Space>::moveset(boost::function<particle<Space> (rng*)> pfInit) 
{ 
    library_namespace::moveset<Space>(
     pfInit.target<particle<Space>(rng*)>() // parameter 1 
    ); 
} 

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

+0

Чтение вашего предыдущего [вопроса] (http://stackoverflow.com/questions/9997299/how-to-pass-class-member-functions-to-a-method-in-a-3rd-party-library) Я не уверен, что вышеупомянутое фактически решает исходную проблему. Я подробно рассказал об исходном вопросе. – Zero