继续这个问题
How to pass class member functions to a method in a 3rd party library?
快速回顾一下,我需要将指向函数的指针传递给第三方库中名为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);
生成的编译器错误是
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 :(得分: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
);
}
创建包装器意味着您只需要在一个地方处理原始函数指针。 希望对代码段中的任何和所有错误都有帮助,并为此道歉!