Rather than just crowbarring it with a void, something you can do is:
class PhysicsBody
{
public:
~virtual PhysicsBody(){ }
};
// inside the Bullet specific Body
class BulletPhysicsBody : public PhysicsBody
{
public:
btRigidBody *getBulletBody() const;
};
// inside the Bullet specific World
void handleBody(PhysicsBody *body)
{
#ifdef DEBUG
BulletPhysicsBody *b = dynamic_cast<BulletPhysicsBody*>(body);
if(!b) throw SomeKindOfAssertException();
#else
BulletPhysicsBody *b = static_cast<BulletPhysicsBody*>(body);
#endif
b->getBulletBody();
}
Static cast is pretty much free, but this gives you the option to check the cast in a debug build for example.
Just a thought. Creates even more interfaces to maintain of course :)