1

我正在 C++11 中创建一个 lua 绑定。我想处理可变参数模板中的每种类型。

我在想我可以做这样的事情,除了 usingParams...代表它内部的所有类型,而不是像可变参数函数参数那样的下一个单一类型。

template <class T, typename ReturnType, typename... Params>
struct MemberFunctionWrapper <ReturnType (T::*) (Params...)>
{

    static int CFunctionWrapper (lua_State* luaState)
    {
        for(int i = 0; i < sizeof...(Params); i++)
        {
             //I want to get the next type, not all of the types
             CheckLuaValue<Params...>();
             //Do other stuff
        }
    }
};

我该怎么做呢?

4

1 回答 1

6

您可以通过在函数调用后简单地扩展为可以扩展的内容来做到这一点。

// put this in your namespace
struct Lunch { template<typename ...T> Lunch(T...) {} }; 

// and this instead of the for loop
Lunch{ (CheckLuaValue<Params>(), void(), 0)... };

你可以用 lambda 做其他事情。你甚至可以让你的i增量

static int CFunctionWrapper (lua_State* luaState)
{
    int i = 0;
    Lunch{ 
      (CheckLuaValue<Params>(), 
       [&]{ std::cout << "That was param " << i << std::endl; }(),
       ++i)... 
    };
}

请注意,标准支持将所有内容放入 lambda。直到最近(我上次检查)的编译器支持不是很好

static int CFunctionWrapper (lua_State* luaState)
{
    int i = 0;
    Lunch{([&]{ 
       CheckLuaValue<Params>();
       std::cout << "That was param " << i << std::endl;
    }(), ++i)... 
    };
}
于 2012-11-18T21:09:16.390 回答