Jak używać szablonów zmiennych do tworzenia opakowania ogólnego funkcji Lua?

W moim obecnym projekcie pisałem wiele opakowań C / C ++ do Lua. Wiele z nich to proste selektory i gettery, więc udało mi się napisać kilka szablonów, które ułatwiają ich generowanie, w ten sposób:

//        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> }, 
    ...
};

Chciałbym zrobić coś podobnego dla prostych funkcji opakowujących dla dowolnych funkcji. Na przykład byłoby miło móc to zrobić:

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> }, 
    ...
};

Pomysł polega na tym, że szablon faktycznie okazuje się być taki, gdy zostanie skompilowany:

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;
}

Próbowałem po prostu użyć... expander, problemem dla mnie są wartości indeksu liczb całkowitych do odwzorowania odpowiednich argumentów. Nie potrafię wymyślić, jak sprawić, by działali prawidłowo. Czy taka rzecz jest możliwa?

(jest tu już trochę magii; napisałem kilka szablonów dla rzeczy takich jak lua_push i lua_check. Wszystkie te istniejące opakowania można znaleźćtutaj)

questionAnswers(2)

yourAnswerToTheQuestion