Как использовать переменные шаблоны, чтобы сделать универсальную оболочку функции Lua?
Для моего текущего проекта я много писал на C / C ++ для Lua-оболочек. Многие из них являются простыми установщиками и получателями, поэтому мне удалось написать несколько шаблонов, облегчающих их генерацию, например:
// Class Return Field
template <typename T, typename U, U T::*Member>
int luaU_get(lua_State* L)
{
T* obj = luaW_check<T>(L, 1);
luaU_push<U>(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<Foo, Bar, &Foo::bar> },
...
};
Я хотел бы сделать нечто подобное и для простых функций-оболочек для произвольных функций. Например, было бы неплохо сделать это:
template <typename T, typename U, U (T::*Func)(), typename... Args>
int luaU_func(lua_State* L)
{
// ...?
}
static luaL_reg Foo_Table[] =
{
...
{ "baz", luaU_func<Foo, int, &Foo::baz, int, float> },
...
};
Идея состоит в том, что шаблон эффективно оказывается таким при компиляции:
int luaU_func(lua_State* L)
{
luaU_push<int>(L, luaW_check<Foo>(L, 1)->baz(luaU_check<int>(L, 2), luaU_check<float>(L, 3)));
return 1;
}
Я пытался использовать только...
Расширитель, проблема для меня - целочисленные значения индекса для сопоставления с правильными аргументами Я не могу придумать, как заставить их работать правильно. Это вообще возможно?
(здесь уже происходит немного магии; я написал несколько шаблонных оболочек для таких вещей, как lua_push и lua_check. Все эти существующие оболочки можно найтиВот)