سؤال

ولدي هذا التوقيع وظيفة لدي لمطابقة

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 من   "دفعة :: الدالة 'ل   "lua_CFunction '

أحد يعرف كيف يمكن حلها؟

هل كانت مفيدة؟

المحلول

وهذا لا يمكن حلها مباشرة. لوا API يريد مؤشرات الدالة سهل منك - هذا مجرد مؤشر الرمز، ولا شيء غير ذلك. وفي الوقت نفسه، boost::function هو كائن وظيفة، وليس هناك طريقة يمكن ان تكون قابلة للتحويل إلى مؤشر دالة عادي، لأنه - تحدث تقريبا - أنه يجسد ليس فقط رمز، ولكن أيضا للدولة. في المثال الخاص بك، الدولة استولت هي قيمة self. لذلك فقد مؤشر رمز الرمز، وبعض البيانات - وAPI الهدف يتوقع مجرد مؤشر كود

نصائح أخرى

والمشكلة هي أن المترجم غير قادر على استدلال على معلمة قالب لأن هناك التحويل الضمني.

وتحتاج إلى تخزين مؤشر الدالة إلى كائن وظيفة.

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

وظيفة الخاص بك يتوقع نوع الفراغ العودة وأن هناك حاجة لتغيير كثافة العمليات أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top