Problem using boost :: bind & boost :: function

Following this question

How can I pass class member functions to a method in a third party library?

Quick recap: I need to pass function pointers to the constructor of a class called moveet in a third party library with a definition

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

      

The examples provided by the library are simply to define global functions for pfInit etc., call them f, g and h. Then call smc :: moveet Moveset (f, g, h) from the controller class;

I tried to implement the suggestion using boost: bind. Unfortunately, I am struggling to get this to work.

class IK_PFWrapper
{
 public:

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

... 
} ;

      

in controller class

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); 

      

Resulting compiler error,

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

      

Any help is greatly appreciated

+3


source to share


1 answer


See the demote boost :: function for a simple function pointer.

boost::function

(created with boost::bind

does not automatically convert to plain old function pointer.

I suggest creating a shell interface that uses boost::function

, i.e. your example (reduced to one parameter) would look something like this:



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

      

Wrapping means you have to deal with raw function pointers in one place. Hope this helps and apologizes for any mistakes in the code snippet!

0


source







All Articles