Domanda

Ho questa firma della funzione che devo abbinare

typedef int (*lua_CFunction) (lua_State *L);//target sig

Ecco quello che ho finora:

    //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);
}

Tuttavia, su lua_register (_luaState ... , si sta ancora lamentando dei problemi di conversione

  

Errore 1 errore C2664:   'lua_pushcclosure': impossibile convertire   parametro 2 da   'boost :: function' in   'Lua_CFunction'

Qualcuno sa come risolverlo?

È stato utile?

Soluzione

Questo non può essere risolto direttamente. L'API Lua vuole un semplice puntatore a funzione: è solo un puntatore a codice e nient'altro. Nel frattempo, boost :: function è un oggetto funzione, e non c'è modo che possa essere convertibile in un semplice puntatore a funzione, perché - in termini approssimativi - cattura non solo il codice, ma anche lo stato. Nel tuo esempio, lo stato acquisito è il valore di self . Quindi ha un puntatore di codice per il codice e alcuni dati - e l'API di destinazione prevede solo il puntatore di codice.

Altri suggerimenti

Il problema è che il compilatore non può dedurre il parametro template perché c'è una conversione implicita.

È necessario memorizzare il puntatore a funzione in un oggetto funzione.

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

E la tua funzione prevede un tipo di ritorno vuoto e che è necessario cambiare anche in int.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top