Для моего текущего проекта я написал много оболочек C/C++ для Lua. Многие из них являются простыми сеттерами и геттерами, поэтому мне удалось написать несколько шаблонов, упрощающих их создание, например:
// Class Return Field
template
int luaU_get(lua_State* L)
{
T* obj = luaW_check(L, 1);
luaU_push(L, obj->*Member);
return 1;
}
static luaL_reg Foo_Table[] =
{
...
// Now I can just use this generic template to avoid
// writing simple getter functions
{ "getbar", luaU_get },
...
};
Я хотел бы сделать что-то подобное и для простых оболочек функций для произвольных функций. Например, было бы неплохо иметь такую возможность:
template
int luaU_func(lua_State* L)
{
//...?
}
static luaL_reg Foo_Table[] =
{
...
{ "baz", luaU_func },
...
};
Идея состоит в том, что шаблон фактически оказывается таким при компиляции:
int luaU_func(lua_State* L)
{
luaU_push(L, luaW_check(L, 1)->baz(luaU_check(L, 2), luaU_check(L, 3)));
return 1;
}
Я пробовал просто использовать расширитель ...
, проблема для меня заключается в том, что значения целочисленного индекса сопоставляются с правильными аргументами. Я не могу придумать, как заставить их работать правильно. Такое вообще возможно?
(здесь уже происходит немного волшебства; Я написал несколько шаблонных обёрток для таких вещей, как lua _push и lua _check. Все эти существующие оболочки можно найти здесь)