私の現在のプロジェクトでは、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 などのテンプレート化されたラッパーをいくつか書きました。これらの既存のラッパーはすべてここにあります)