Как связать перегруженные функции с Luabind? - PullRequest
2 голосов
/ 24 апреля 2011

Я пишу игровой движок на c ++, который будет предоставлять сценарии Lua (для обертывания которого я использую Luabind), и у меня возникают некоторые проблемы с привязкой перегруженных функций. А именно: у меня перегружена функция:

void setGlobalPosition(const Vec3& position);

void setGlobalPosition(Real x, Real y, Real z);

И я хотел бы раскрыть их обоим Луа. очевидно, это неправильно:

luabind::module(L)[ luabind::class_<Critter::Body>("Body") .def("setGlobalPosition", &Critter::Body::setGlobalPosition ) ];

Я нашел способ сделать это на этом сайте http://www.codeproject.com/KB/graphics/luabindLuaAndOgre3d.aspx?msg=3376320 (очень хороший учебник для Luabind - я настоятельно рекомендую его) вот так:

luabind::module(L)[ luabind::class_<Critter::Body>("Body") .def("setGlobalPosition", (void( Critter::Body::*)(const Vector3&))Critter::Body::setGlobalPosition ) ];

но это также дает мне ошибки (я могу прикрепить их, если кому-то интересно).

я тоже пробовал .def("setGlobalPosition", Critter::Body::setGlobalPosition<Vector3> ) но все равно ошибки.

Есть идеи, как мне это сделать?


EDIT: Хорошо, я нашел способ сделать это так:

.def("setGlobalPosition", ( void(Critter::Body::*)(Vector3) ) &Critter::Body::setGlobalPosition )

из документации luabind, но я получаю ошибки (первая):

ошибка C2440: «приведение типа»: невозможно преобразовать из перегруженной функции в 'void (__thiscall Critter :: Body :: * ) (Ogre :: Vector3) '

но в любом случае проблема возникает, потому что эта функция унаследована (она взята из NxOgre::Actor::, поэтому я не считаю, что правильный подход в любом случае


РЕДАКТИРОВАТЬ 2:

Я только что попытался связать версию функции с 3 числами с плавающей точкой в ​​качестве параметров и ... удивительно, что все компилируется просто отлично, но версия с vector3 не делает ....: (

это то, что я использовал для реализации функции 3 float:

.def("setGlobalPosition", ( void(Critter::Body::*)(float,float,float) ) &Critter::Body::setGlobalPosition )

Я в замешательстве об этом; (

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Этот вопрос сейчас кажется довольно старым, но я решил, что у вас до сих пор нет ответа на ваши последние правки:

(( void(Critter::Body::*)(Vector3) ) &Critter::Body::setGlobalPosition)

не содержит спецификатора const и reference-ampersand в типе функциибросить в.Это должно быть:

(( void(Critter::Body::*)(const Vector3&) ) &Critter::Body::setGlobalPosition)
0 голосов
/ 24 апреля 2011

Как отметил DeadMG, вам не хватает амперсанда перед функцией-членом.Учебник, на который вы ссылаетесь, также отсутствует.Некоторым компиляторам может быть все равно, но g ++ это делает, и, возможно, некоторым другим тоже.

...