gpt4 book ai didi

c++ - 创建具有特定签名的 C++ 静态包装函数

转载 作者:行者123 更新时间:2023-11-30 04:18:12 27 4
gpt4 key购买 nike

我在使用模板参数创建静态包装器函数时遇到了一些问题。我不想将函数直接传递给包装函数,因为它需要一个特定的签名 int (lua_State *) 以便它可以传递给以下函数:

lua_pushcfunction(L, function);

(没错,我要一个自动生成的 lua 包装器。)

我的第一个想法是创建一个带有函数指针作为非类型模板参数的模板函数。

template <void(* f)(void)>
int luaCaller(lua_State * _luaState)
{
f();

return 0;
}

到目前为止,这看起来还不错。此函数具有正确的签名,并调用我通过模板参数传入的函数。

&(luaCaller<myFunc>)

当我尝试将它包装在另一个函数中时,我的问题出现了。非类型模板参数必须外部链接,因此以下失败:

void pushFunction(lua_State * _luaState, void(* _f)(void))
{
lua_pushcfunction(_luaState, &(luaCaller<_f>));
}

这是有道理的,因为函数的地址需要在编译时知道。您不能只输入任何指针并期望编译器知道要创建哪些类。不幸的是,如果我添加一个在编译时已知的函数指针,它仍然会失败。函数指针的值被复制到 _a 中,因此 _a 在技术上在编译时仍然未知。正因为如此,我希望以下内容能够工作:

void pushFunction(lua_State * _luaState, void(* const _f)(void))
{
lua_pushcfunction(_luaState, &(luaCaller<_f>));
}

或者也许

void pushFunction(lua_State * _luaState, void(* & _f)(void))
{
lua_pushcfunction(_luaState, &(luaCaller<_f>));
}

第一种情况,因为这个值是不允许改变的,所以我们知道如果是外链,技术上还是外链。在第二种情况下,它作为引用传入,这意味着它应该具有相同的链接,不是吗?但是这些尝试都不起作用。为什么?有可能以某种方式规避这个吗?我怎样才能干净地自动生成调用另一个函数的函数?

最佳答案

const 限定符意味着您不能更改某些内容,而不是它是一个编译时常量。 _a 的初始值是在调用函数时在运行时确定的,对于 * const &a,该值甚至可以在运行时通过某些外部方式(例如另一个)更改线程,如果引用下的对象不是 const

为了使完​​全模板化的包装器工作,您需要为编译器提供足够的信息来为每个可能的模板参数编译一个函数,并提供在这些函数之间切换的逻辑。模板系统生成并组织相关功能,但它不是动态调度器。

如果您可以将函数指针添加到 lua_State 对象并删除模板参数,那将是一种解决方案。

如果将函数指针作为 doCaller 的模板参数,您的解决方案会奏效,但这会违背其目的。

关于c++ - 创建具有特定签名的 C++ 静态包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16592035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com