テンプレート パラメーターを使用して静的ラッパー関数を作成する際に問題が発生しています。int (lua_State *)
次の関数に渡すことができるように特定の署名が必要なため、関数をラッパー関数に直接渡したくありません。
lua_pushcfunction(L, function);
(そうです、自動生成された lua ラッパーを使用します。)
私が最初に考えたのは、非型テンプレート引数として関数ポインターを使用してテンプレート関数を作成することです。
template <void(* f)(void)>
int luaCaller(lua_State * _luaState)
{
f();
return 0;
}
これまでのところ、これはかなり良さそうです。この関数には適切なシグネチャがあり、テンプレート引数を介して渡した関数を呼び出します。
&(luaCaller<myFunc>)
これを別の関数でラップしようとすると、私の問題が発生します。型のないテンプレート パラメーターは外部にリンクする必要があるため、次の処理は失敗します。
void pushFunction(lua_State * _luaState, void(* _f)(void))
{
lua_pushcfunction(_luaState, &(luaCaller<_f>));
}
関数のアドレスはコンパイル時に知る必要があるため、これは理にかなっています。任意のポインターをスローして、コンパイラーがどのクラスを作成するかを知ることを期待することはできません。残念ながら、コンパイル時に既知の関数ポインターを追加しても失敗します。関数ポインターの値は _a にコピーされているため、_a はコンパイル時にまだ技術的に認識されていません。このため、次のことが機能することを期待しています。
void pushFunction(lua_State * _luaState, void(* const _f)(void))
{
lua_pushcfunction(_luaState, &(luaCaller<_f>));
}
または多分
void pushFunction(lua_State * _luaState, void(* & _f)(void))
{
lua_pushcfunction(_luaState, &(luaCaller<_f>));
}
最初のケースでは、値の変更が許可されていないため、外部リンクされている場合でも、技術的には外部リンクのままであることがわかっています。2 番目のケースでは、参照として渡されています。これは、同じリンケージを持つ必要があることを意味します。しかし、これらの試みはどちらもうまくいきません。なんで?何とかこれを回避することは可能ですか?別の関数を呼び出す関数をきれいに自動生成するにはどうすればよいですか?