質問

一致する必要があるこの関数シグネチャがあります

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に変更する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top