- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 lib Bullet 中定义了一个类型:
typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
在文档中有一个 sample of usage (page 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);
}
我将这个示例代码复制到我的类(class)防御中,所以我的类(class)获得了这个功能,我将能够进行这样的转换:
dispatcher->setNearCallback(boost::bind(&BulletAPIWrapper::MyNearCallback, this, _1, _2, _3));
而不是像 Bullet 教程中的 dispatcher->setNearCallback(MyNearCallback);
这样的 C。
但是我的 VS2010 sp1 给我一个错误:
Error 44 error C2664: 'btCollisionDispatcher::setNearCallback' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>' to 'btNearCallback'
所以我想知道如何将 boost::bind 转换为这样的 typedef?
是否可能具有静态类函数(或至少是全局函数):
void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo, BulletAPI* api) {
}
调用 dispatcher->setNearCallback( boost::bind(MyNearCallback, _1, _2, _3, this));
因为这对我来说几乎是同样的错误:
Error 44 error C2664: 'btCollisionDispatcher::setNearCallback' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>' to 'btNearCallback'
我也试过as described here :
template<unsigned ID,typename Functor>
boost::optional<Functor> &get_local()
{
static boost::optional<Functor> local;
return local;
}
template<unsigned ID,typename Functor>
typename Functor::result_type wrapper(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo)
{
return get_local<ID,Functor>().get()(collisionPair, dispatcher, dispatchInfo);
}
template<typename ReturnType>
struct Func
{
typedef ReturnType (*type)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
};
template<unsigned ID,typename Functor>
typename Func<typename Functor::result_type>::type get_wrapper(Functor f)
{
(get_local<ID,Functor>()) = f;
return wrapper<ID,Functor>;
}
struct NearCallbackWrapper
{
class BulletAPI;
void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) {
std::cout << "called" << std::endl;
}
};
//....
dispatcher->setNearCallback( get_wrapper<0>( boost::bind(&NearCallbackWrapper::MyNearCallback,this) ) );
但是我从中得到了这样的错误:
error C2664: 'btCollisionDispatcher::setNearCallback' : cannot convert parameter 1 from 'void (__cdecl *)(btBroadphasePair &,btCollisionDispatcher &,const btDispatcherInfo &)' to 'btNearCallback'
最佳答案
为什么你认为你“应该能够像……一样施法”? setNearCallback 当然期望传递一个正常的函数指针,而 BIND 产生完全不同的东西..
事实上 Bind 产生了一个“可调用的东西”而不是“需要'this'指针”并不意味着它产生了一个普通的函数!
要正确处理绑定(bind)成员函数,您仍然需要至少两个指针的空间,而普通函数指针是一个指针。所有允许您注册回调的 sane *) API 还允许您将一些“用户数据”与回调一起传递 - 在这种情况下,您可以使用它来创建将调用重定向到您的绑定(bind)成员函数。这已经在很多地方讨论过了。请参见示例:https://stackoverflow.com/a/3453616/717732
如果您不能随回调传递任何其他数据,我的意思是,如果回调注册允许您仅提供回调指针,那么它几乎是死路一条。除非你用 ie 做一些或多或少丑陋或有风险的解决方法,否则你无法逃避。全局静态数据或动态代码生成..
*) 这纯属个人观点。 “理智”是指“对象友好”。低级 API 通常并不是严格意义上的,而是它们试图尽可能节省资源——因此它迫使你自己做脏活,因为它们想要真正节省 4/8 字节。有时,有时,这实际上会产生巨大的影响——它们可能会更容易地传递 4/8b 回调,它很容易复制,因为它适合单个寄存器(而指针+用户数据将占用 2 个以上的寄存器),对它的操作“更原子化” "等。然而,大多数情况下,这样做是为了痛苦地强调只有一个可能要注册的回调。在这种情况下,无论它是某个对象的绑定(bind)成员函数,还是只是一个全局静态函数,它实际上对您的影响很小:总而言之,只能有一个,所以,嗯,不管怎样,让它工作。如果是这种情况,则只需将全局静态变量用于对象指针和小包装器。好吧,除了美学......:
static MyObject* target;
void wrapper(..params..)
{
target->method_to_be_called(..params..);
}
// then, register it:
target = &object_to_be_called; // \ there can be only one object
setCallback(&wrapper); // / and only one callback registered
关于c++ - 如何将 boost::bind(&myClass::fun, this, _1, _2, _3) 转换为 typedef void (*fun)(arg1, arg2, arg3)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14803922/
在学习 C++ 的过程中,我偶然发现了文章 Writing Copy Constructors and Assignment Operators它提出了一种机制来避免复制构造函数和赋值运算符之间的代码
显然,以这种方式实现基于类的实例方法是 JavaScript 中的一个习惯用法: function MyClass(){...} MyClass.prototype.methodA = functio
我尝试使用泛型为 NSManagedObject 的子类提供通用方法,但当 Swift 似乎无法找到/将泛型转换为具体类时,我收到错误: /// NSManagedObject+Helper.swif
有什么区别 MyClass mc = MyClass(); 和 MyClass mc; 在 C++ 中? 最佳答案 第一个调用复制构造函数,以临时对象作为参数 - MyClass() 创建临时对象。
考虑不涉及复制省略的情况(C++17 之前)。 来自 cppreference(再次假设 C++14): Temporary objects are created in the following
这里有一些代码: class MyClass { public: int y; }; int main() { MyClass item1; MyClass item2 = M
这种类型转换表达式之间有什么区别?什么是更好的? // One way var t:MyClass = MyClass(o); // Another var t:MyClass = o as MyCl
为了跟踪实例,我们有一个数组 MyClass[] mc = new MyClass[5]; 我想在构造函数调用本身期间保存在此数组中创建的 MyClass 实例。 类似这样的事情: public cl
我在对一个非常简单的类进行子类化时遇到问题,该类也有返回初始类的方法。 public class MyClass { public MyClass(){ } public MyC
我有一个 std::list在我的课上我有 myclass::operator bool PComp(const T * const & a, const T * const & b) { re
我正在编写一个简单的程序来计算面积,我得到的错误是: no matching function for call to 'myclass::myclass()' 我无法理解此错误的原因以及解决方法。
我希望我可以针对这个问题逐字发布我的项目,但我不能。 基本上,我有以下类(class): class Lowest { someValue: string constructo
为什么可以施放MyClass反对 List没有编译错误(只是有“未检查”警告),尽管 MyClass未实现 List 接口(interface),同时无法进行强制转换,例如 String类同样的方式。
我正在这里试验一下。 假设我有一个类: static class MyClass { static String property = "myProperty"; } 和一个方法: publi
我正在尝试为单元测试目的创建一个 stub 类。 Stub 指向完全相同的 EmployeeData 类定义,但编译器认为它们是不同的,不知何故。结果,我不断收到以下消息: Cannot implic
为什么我不能通过 Point src[1][4] = { { Point(border,border), Point(border,h-border),
我有一个正在创建的模板类,我需要一个方法来返回该类的对象并对其进行分配。我有一个方法接收 2 个对象、创建一个新对象并返回它,以及重载赋值运算符以正确复制成员。 我试过用两种方法来做到这一点(两种方法
在 C# 中是否可以在运行时创建一个类型,该类型继承自泛型类,其中基类的模板参数是正在构造的当前类?这将编译正常: // I have this class: public class OtherCl
我有几个带有“listingThumb”类的 div CSS: .listingThumb{ height:50px; width:50px; overflow:hidden; } HTML: 我希
例如,我有一个包含不同容器的类来保存由 new 运算符创建的 MyClass 对象: class A{ MyClass* m; vector vm; vector > vvm;
我是一名优秀的程序员,十分优秀!