Используя Lua C API, я зарегистрировал простой класс Object
в Lua, например:
// My C++ Object class
class Object {
private:
double x;
public:
Object(double x) : x(x){}
};
// Create and return instance of Object class to Lua
int object_new(lua_State* L)
{
double x = luaL_checknumber(L, 1);
*reinterpret_cast<Object**>(lua_newuserdata(L, sizeof(Object*))) = new Object(x);
luaL_setmetatable(L, "Object");
return 1;
}
// Functions to register to Lua
const luaL_Reg functions[] =
{
{"new", object_new},
{nullptr, nullptr}
};
// Register the Object class to Lua
luaL_newmetatable(L, "Object");
luaL_setfuncs(L, functions, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
В моем скрипте Lua отлично работает следующее:
// Works!
my_object = Object.new(42)
Но я хотел бы иметь возможность сделать это (т.е. опустить часть .new
):
// Fail :(
my_object = Object(42)
Но когда я запускаю сценарий Lua, я получаю эту ошибку:
...attempt to call a table value (global 'Object').
Есть ли способ зарегистрировать класс C++ таким образом, чтобы вызывался конструктор, если мы не указываем имя функции? Что я пропустил, чтобы сделать эту работу? Это было бы особенно полезно для временных объектов.
Спасибо!
__call
в свою метатаблицуObject
. - person Joel Cornett   schedule 24.02.2016