我正在尝试做的基本上是能够调用一个函数并让它用lua注册一个c ++函数。基本上就像registerFunction(function)。现在,我知道有些库可以帮到你,但我想知道有人会这样编写一个库。
我目前的方法是使用模板为传递给它的函数生成相关的粘合函数。
我的代码现在看起来像这样:
template<typename F>
struct registerStruct
{
template<typename T>
struct inner
{
static int func(lua_State*);
};
};
template<typename F>
void registerFunction(const char *name,F function)
{
lua_register(this->L,name,®isterStruct<decltype(function)>::inner<function>::func);
}
template<typename F>
struct registerStruct<F(void)> //I would write more classes for different numbers of arguments
{
template<F(*T)(void)>
struct inner
{
static int func(lua_State *L)
{
returnLua(L,T()); //push the return value onto lua's stack
return 1;
}
};
};
然后我尝试使用它:
int test(void)
{
std::cout<<"hello from c++"<<std::endl;
return 0;
}
registerFunction("test",test);
使用gcc进行编译会产生错误:: func尚未声明。
答案 0 :(得分:1)
registerStruct<decltype(function)>::inner<function>::func
首先,decltype(function)
可以替换为F
。
此外,类模板inner
期望一个类型作为其模板参数,function
是一个表达式,而不是一个类型。这应该是::inner<F>
。
(或者inner
可能根本不需要是模板。嵌套类outer<T>::inner
仍然可以使用附加到其封闭类的模板参数T
。)
C ++语法需要一些奇怪的东西来帮助解析器找出模板的含义。通常,C ++的含义取决于标识符是用于变量(对象还是引用),类型还是模板。但是在模板中::
或.
或->
之后,如果运算符左侧的类型取决于模板参数,则在初始解析期间无法确定下一个名字是。如果你不帮忙,语言将假设名称是变量。
所以C ++认为registerStruct<decltype(function)>::inner
是一个变量。然后我们有小于运算符<
,后跟有效表达式function
,然后是大于运算符>
,然后是::func
。等等,没有什么叫::func
!
要指定inner
确实是模板,您需要
®isterStruct<F>::template inner<F>::func