在lib Bullet中定义了一种类型:
typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
Run Code Online (Sandbox Code Playgroud)
在那里的文档中提供了一个使用示例(第23页):
void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) {
// Do your collision logic here
// Only dispatch the Bullet collision information if you want the physics to continue
dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo);
}
Run Code Online (Sandbox Code Playgroud)
我将这个示例代码复制到我的类defention中,所以我的类得到了这个函数,我将能够做这样的演员:
dispatcher->setNearCallback(boost::bind(&BulletAPIWrapper::MyNearCallback, this, _1, _2, _3));
Run Code Online (Sandbox Code Playgroud)
而不是像dispatcher->setNearCallback(MyNearCallback);Bullet教程那样的C.
然而我的VS2010 sp1给了我一个错误:
Error 44 error C2664: 'btCollisionDispatcher::setNearCallback' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>' to 'btNearCallback'
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何将boost :: bind转换为这样的typedef?
是否有可能具有静态类函数(或至少是全局函数):
void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& …Run Code Online (Sandbox Code Playgroud) 我正在尝试c使用这个熟悉的模式与写入的库进行交互:
void some_c_handler(void(*func)(void*), void* data);
Run Code Online (Sandbox Code Playgroud)
现在,我想C++为这个函数编写一个包装器,如下所示:
void my_new_cpp_handler(std::function<void()>&& func)
{
void (*p)() = foo(func);
void* data = bar(func);
some_c_handler(p, data);
}
Run Code Online (Sandbox Code Playgroud)
双方some_c_handler并my_new_cpp_handler正在解决相同的问题; 他们与某个州一起承担某种功能.但后者是首选的,因为它从用户抽象出大部分实现细节,并允许简单地传入lambda对象.
因此,my_new_cpp_handler应该获取func它给出的参数,将其转换为函数指针并将其状态传递给data.
我对标准或执行情况了解不够,std::function知道这是否是一个合理的要求.能foo和bar存在吗?
换句话说,我想要的是能够将有状态函数传递给c回调处理程序,而不必手动实例化我自己的struct类型以传递它.显然std::function已经为我们做了这个,所以我希望能够以某种方式将函数指针与状态分开并将其传递给c-style处理程序.这可能吗?
我想使用GNU科学库,需要转换std::function为gsl_function,类型为double (* function) (double x, void * params)。
到目前为止,我只是尝试过:
class Numerics {
public:
....
double integrate(function<double(double)> &func) {
double result, error;
gsl_function F;
F.function = static_cast<(*)(double, void *)>( func );
gsl_integration_qag(&F, 0, 1, epsabs_, epsrel_, 1000, 6, w_, &result, &error);
return result;
}
...
};
Run Code Online (Sandbox Code Playgroud)
,这使我退回错误
类型名称需要指定符或限定符