lua/luabind — Добавлять и перезаписывать методы класса через lua

Я использую lua 5.2.2 с luabind 0.9.

Я хотел бы иметь возможность добавлять дополнительные методы классов через lua для любых классов, которые я связал в С++, но я не уверен, как это сделать.

Проблема в том, что luabind использует функцию в качестве метаметода __index для любых связанных классов вместо таблицы, поэтому я вообще не вижу способа получить доступ к методам классов.

например, я связываю свои классы следующим образом:

luabind::module(lua)
[
    luabind::class_<testClass>("TestClass")
    .def(luabind::constructor<>())
    .def("TestFunc",&TestFunc)
];

По сути, я хочу добавить lua-функцию в список методов для этого класса и иметь возможность перезаписывать существующие:

local t = tableOfClassMethods
local r = t.TestFunc -- Reference to the c++-function we've bound
t.SomeFunction = function(o) end -- New function for all objects of this class
t.TestFunc = function(o) end -- Should overwrite the c++-function of the same name

Любая помощь будет оценена по достоинству.


person Silverlan    schedule 08.10.2013    source источник


Ответы (1)


Вы можете использовать свойство luabind::object и зарегистрировать его с помощью метода .property luabind.

Что-то вроде этого:

//Class
class FunctionCaller
{
public:
    luabind::object Fn;

    void SetFn(luabind::object NewFn)
    {
        Fn = NewFn;
    };

    luabind::object GetFn()
    {
        return Fn;
    };
};

//Binding Code
luabind::class_<FunctionCaller>("FunctionCaller")
    .def(luabind::constructor<>())
    .property("Fn", &FunctionCaller::Fn, &FunctionCaller::SetFn, &FunctionCaller::GetFn)

Затем вам просто нужно вызвать luabind::object в соответствии с документацией luabind.

Это не совсем то, что вы хотите сделать, но я думаю, это может помочь вам перезаписать функцию. Вы можете связать реальную функцию и иметь свойство, проверить, не является ли luabind::object ненулевым, и вызвать его или нативную функцию.

person Little Coding Fox    schedule 28.10.2013