1

我要做的基本上是能够调用一个函数并让它用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,&registerStruct<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 尚未声明。

4

1 回答 1

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真的是一个模板,你需要

&registerStruct<F>::template inner<F>::func
于 2013-06-12T01:17:53.327 回答