ブーストバインド/機能のサポート
-
06-07-2019 - |
質問
一致する必要があるこの関数シグネチャがあります
typedef int (*lua_CFunction) (lua_State *L);//target sig
これまでの所持品は次のとおりです。
//somewhere else...
...
registerFunction<LuaEngine>("testFunc", &LuaEngine::testFunc, this);
...
//0 arg callback
void funcCallback0(boost::function<void ()> func, lua_State *state)
{
func();
}
template<typename SelfType>
void registerFunction(const std::string &funcName, boost::function<void (SelfType*)> func, SelfType *self)
{
//funcToCall has to match lua_CFunction
boost::function<void (lua_State *)> funcToCall = boost::bind(&LuaEngine::funcCallback0, this,
boost::bind(func, self), _1);
lua_register(_luaState, funcName.c_str(), funcToCall);
}
ただし、 lua_register(_luaState ...
では、変換の問題についてまだ文句を言っています
エラー1エラーC2664: 'lua_pushcclosure':変換できません パラメータ2 'boost :: function'へ 'lua_CFunction'
これを解決する方法は誰でも知っていますか?
解決
これは直接解決できません。 Lua APIは、単純な関数ポインターを必要としています。これは単なるコードポインターであり、他には何もありません。一方、 boost :: function
は関数オブジェクトであり、単純な関数ポインターに変換できる方法はありません。大まかに言えば、コードだけでなく状態もキャプチャするためです。この例では、キャプチャされた状態は self
の値です。そのため、コードのコードポインターと一部のデータがあり、ターゲットAPIはコードポインターのみを想定しています。
他のヒント
問題は、暗黙的な変換があるため、コンパイラがテンプレートパラメータを推測できないことです。
関数ポインタを関数オブジェクトに保存する必要があります。
function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this)
registerFunction<LuaEngine>("testFunc", f);
そして、あなたの関数はvoid戻り値の型を期待し、それもintに変更する必要があります。
所属していません StackOverflow