Код: Выделить всё
// accepts a Lua state with the input/s in the stack
// returns the number of outputs, pushes "actual" outputs onto the stack
int Func(lua_State* L)
< /code>
Представьте, что у меня есть, например, функции, которые выглядят так: < /p>
int Add(int x, int y)
double Divide(double x, double y)
void DoStuff(int x, double y, CString abc)
< /code>
Мне понадобится обертка (давайте назовем ее luawrapper :: genericfunction), которая будет выглядеть как приведенный выше вызов API Lua C, прочитайте различные типизированные входы из стека, вызовите соответствующую функцию с этими входами и возвращайте правильно типированный выход. < /p>
lua обычно деликации. Здесь я грубо обрисовываю синтаксис того, как будет использоваться Luawrapper :: genericfunction: < /p>
// have the Lua state redirect scripted calls to "Add" to this function:
// LuaWrapper::GenericFunction takes the Lua state, the function itself, the output type, and a list/string/whatever of the input types; then calls the function on those inputs and pushes the output onto the Lua state's stack
lua_register(L, "Add", Add); // vs:
lua_register(L, "Add", [](lua_State* L) { return LuaWrapper::GenericFunction(L, RealFunctions::Add, INT_TYPE, "INT INT"; });
< /code>
Проблема в том, что я не могу понять, как заставить входные данные работать и как вызвать совершенно общую функцию, которая может иметь в основном любое количество входов любого типа (они гарантируются, что они не являются ссылками, если они не являются объектами класса, для которых у меня есть план DO). Я знаю, что это возможно, так как API MFC COM в основном делает именно это для VBScript.// "Function" outputs an int, and takes two strings and a bool as inputs
// VT_I4 is basically an enum, VTS_??? are strings that get concatenated in this syntax
DISP_FUNCTION(CParentClass, "Function", Function, VT_I4, VTS_BSTR VTS_BSTR VTS_BOOL)
< /code>
затем написан как стандартная функция этого класса; разрешение VBScript вызвать его. < /p>
int CParentClass::Function(CString str1, CString str2, bool true_or_false)Подробнее здесь: https://stackoverflow.com/questions/796 ... ave-arbitr