Как использовать вариативные шаблоны для создания универсальной оболочки функций Lua?

Для моего текущего проекта я написал много оболочек 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. Все эти существующие оболочки можно найти здесь)

7
задан sellibitze 17 August 2012 в 13:15
поделиться