【问题标题】:Help with boost bind/functions帮助提升绑定/功能
【发布时间】:2009-09-11 23:38:19
【问题描述】:

我有这个必须匹配的函数签名

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'

有人知道怎么解决吗?

【问题讨论】:

标签: c++ lua function-pointers boost-bind boost-function


【解决方案1】:

这不能直接解决。 Lua API 需要你提供一个普通的函数指针——这只是一个代码指针,没有别的。同时,boost::function 是一个函数对象,它不可能转换为一个普通的函数指针,因为 - 粗略地说 - 它不仅捕获代码,还捕获状态。在您的示例中,捕获的状态是 self 的值。所以它有一个代码指针和一些数据——目标 API 只需要代码指针。

【讨论】:

  • 请阅读我刚刚发布的答案。我最初的怀疑与您的相似(因为 func ptr 无法捕获状态),但事实证明它可以通过一些不错的魔法。
  • 不,你错了。来自 Boost 文档 (boost.org/doc/libs/1_37_0/doc/html/boost/…):“template&lt;typename Functor&gt; Functor* target(); - 如果它存储了 Functor 类型的目标,则返回目标的地址。否则,返回 NULL 指针。” - 在您的情况下,bind 的结果不会存储lua_CFunction 类型的目标。那里没有魔法(嗯,一般来说没有魔法)。不可能将随机的 8 个字节压缩成 4 个。
【解决方案2】:

问题是编译器无法推导出模板参数,因为存在隐式转换。

您需要将函数指针存储到函数对象中。

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

您的函数需要一个 void 返回类型,并且也需要将其更改为 int。

【讨论】:

  • 我将返回类型更改为 int。一开始忘记了。
  • 我给出的例子应该可以。不工作的原因是为了你的例子。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多