1

私はこの関数の署名を持っています私は一致しなければなりません

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'に変換できません

誰もがこれを解決する方法を知っていますか?

4

2 に答える 2

4

これを直接解決することはできません。Lua API は、単純な関数ポインターを必要としています。これは単なるコード ポインターであり、他には何もありません。一方、boost::functionは関数オブジェクトであり、大まかに言えば、コードだけでなく状態もキャプチャするため、単純な関数ポインターに変換できる方法はありません。あなたの例では、キャプチャされた状態は の値ですself。そのため、コードのコード ポインターといくつかのデータがあり、ターゲット API はコード ポインターだけを想定しています。

于 2009-09-12T00:15:24.377 に答える
1

問題は、暗黙的な変換があるため、コンパイラがテンプレートパラメータを推測できないことです。

関数ポインタを関数オブジェクトに格納する必要があります。

function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this)
registerFunction<LuaEngine>("testFunc", f);

そして、あなたの関数はvoid return型を期待しており、それはintに変更するためにも必要です。

于 2009-09-11T23:54:26.107 に答える