使用 boost::bind 和 boost::function 时出现问题

Trouble with using boost::bind & boost::function

本文关键字:boost 问题 bind 使用 function      更新时间:2023-10-16

此问题的后续内容

如何将类成员函数传递给第三方库中的方法?

快速回顾一下,我需要将指向函数的指针传递给第三方库中名为moveset的类的构造函数,该库具有的定义

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和h。然后从控制器类中调用smc::moveset 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); 

由此产生的编译器错误为,

AlgorithmsIK_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

任何帮助都非常感谢

请参阅将boost::函数降级为普通函数指针。

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

创建包装器意味着您只需要在一个地方处理原始函数指针。希望这能有所帮助,并对代码片段中的任何错误表示歉意!