1

私がやろうとしているのは、基本的に関数を呼び出して、C++ 関数を lua に登録できるようにすることです。基本的には 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

1 つには、decltype(function)に置き換えることができますF

また、クラス テンプレートinnerはそのテンプレート引数として型を想定しており、型functionではなく式です。それはおそらくそうあるべき::inner<F>です。

(またはinner、テンプレートである必要がまったくない場合もあります。ネストされたクラスは、それを囲むクラスにアタッチされたouter<T>::innerテンプレート パラメーターを引き続き使用できます。)T

C++ 構文では、パーサーがテンプレートの意味を理解できるようにするために、いくつかの奇妙なことが必要です。通常、C++ の意味は、識別子が変数 (オブジェクトまたは参照)、型、またはテンプレートのどれであるかによって異なります。ただし、テンプレート内の or の後に::、演算子の左側の型がテンプレート パラメーターに依存する場合、最初の解析中に次の名前がどれであるかを把握することは不可能です。助けないと、言語は名前が変数であると見なします。.->

したがって、C++registerStruct<decltype(function)>::innerは を変数と見なします。次に、小なり演算子<、その後に有効な式function、大なり演算子>、そして があり::funcます。待って、何も呼び出されていません::func!

本当にテンプレートであることを指定するinnerには、必要です

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