- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Luabind 包装器如何在没有 lua_State *L
的情况下传递函数感兴趣。并且不使用 Lua 堆栈。
Luabind 如何:
最佳答案
好问题。我对 luabind 的工作方式有一些模糊的概念,但我没有足够的知识来完整准确地回答。借助 IDE 和调试器,我开始剖析以下非常简单的部分:
struct C
{
int i;
int f(int x, const char* s)
};
lua_State* L = luaL_newstate();
open(L);
module(L)
[
class_<C>("C")
.def_readwrite("index", &C::i)
.def("f", &C::f)
];
L
大量传递给 luabind,调用
open
在 Lua 状态中创建一些全局变量:
__luabind_classes
userdata 类型和两个函数
class
和
property
. Luabind 似乎没有使用全局变量——它需要的一切都保存在 lua 环境中。
module(L)[...]
.原始代码是最好的解释,这里首先是
module
:
inline module_ module(lua_State* L, char const* name = 0)
{
return module_(L, name);
}
module_
:
class LUABIND_API module_
{
public:
module_(lua_State* L_, char const* name);
void operator[](scope s);
private:
lua_State* m_state;
char const* m_name;
};
module_
上调用 operator []。具有一些定义的类(即
scope
参数),但
module_
类知道在哪个 Lua 状态下运行。
scope
类也很有趣(有些部分被省略了,有些部分稍微简化了):
struct LUABIND_API scope
{
//...
explicit scope(detail::registration* reg);
scope& operator,(scope s);
void register_(lua_State* L) const;
private:
detail::registration* m_chain;
};
scope
正在构建
detail::registration
的链表节点,该列表来自使用
operator,
.所以当一个人做
module(L) [class_<...>..., class_<...>...]
,
class_
继承自
scope
用
detail::registration
初始化它的基数实例,然后是
scope
的逗号运算符建立一个所有注册的链表,传递给
module_::operator[]
调用
scope::register_
依次枚举链并调用
register_
所有这些
detail::registration
对象。
lua_State
总是传递给
register_
.
class_<C>("C").def("f", &C::f)
.这构造了
class_<C>
的实例
detail::registration
中的某个名称成员(member)
class_
.调用
class_::def
方法写入 reg 结构等等,但这里有一个非常有趣的行,位于
def
的调用链中。 :
object fn = make_function(
L, f, deduce_signature(f, (Class*)0), policies);
deduce_signature
,我真的很想看看。现在我想取消它,但它的工作方式是这样的:通过由 boost (
BOOST_PP_ITERATE
和其他一些实用程序) 辅助的暗预处理器巫术,为 1 和 LUABIND_MAX_ARITY 之间的每个 N 生成以下内容:
template <class R, class T, class A1, classA2, ..., classAN>
boost::mpl::vectorN_PLUS_2<R, T, A1, A2, ..., AN> // type of return value
deduce_signature(R(T::*)(A1, A2, ..., AN))
{
return boost::mpl::vectorN_PLUS_2<R, T, A1, A2, ..., AN>()
}
deduce_signature
在预处理器之后和编译开始之前最终出现在您的源代码中的函数。从那里,编译器的工作就是选择正确的
deduce_signature
传递给
def
的函数重载这将返回正确的
boost::mpl::vectorX
类型。从那里
make_function
可以做任何事情——它有一个参数类型的 [compile time] 列表,并通过更多的模板魔术来计算这些参数类型,并与 Lua 值相互转换等等。
关于function - Luabind 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114765/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!