Как использовать переменные шаблоны, чтобы сделать универсальную оболочку функции 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. Все эти существующие оболочки можно найтиВот)

Ответы на вопрос(2)

Ваш ответ на вопрос