C++ 访问不同类型的可变模板

C++ 访问不同类型的可变模板,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我正在C++11中创建一个lua绑定。我想在可变模板中处理每种类型 我想我可以这样做,除了使用Params…表示它内部的所有类型,而不是像变量函数参数那样表示它内部的下一个单一类型 template <class T, typename ReturnType, typename... Params> struct MemberFunctionWrapper <ReturnType (T::*) (Params...)> { static int CFunctio

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

我想我可以这样做,除了使用
Params…
表示它内部的所有类型,而不是像变量函数参数那样表示它内部的下一个单一类型

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
        }
    }
};
模板
结构MemberFunctionWrapper
{
静态int CFunctionWrapper(lua_State*luaState)
{
对于(int i=0;i

我该怎么做呢?

您只需在函数调用后扩展到可以扩展到的内容,就可以做到这一点

// 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。不过,直到最近(我上次检查时)的编译器支持都不是很好

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

std::cout您可以通过在函数调用之后简单地扩展到可以扩展到的内容来实现这一点

// 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.Compiler支持中,但不是很好

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

std::cout这不是UB因为函数参数求值没有指定的顺序吗?我会使用(临时)数组:
别名{(…,++I)…}
@Xeo它不是UB:当使用
{…}
时,即使它导致函数调用,顺序也会被定义。请注意,
参数
为空时,您的建议将失败(请求零大小的数组)。啊,很高兴知道。在扩展之前,通过使用一个伪
0
可以很容易地修复零大小写。使用它会给我一个链接器
错误:未定义对“MyNamespace::午餐::午餐(int,int)”的引用
(其中
int,int
是扩展的模板类型)代码建议这样描述:声明一个具有可变模板成员的结构,
sunch{template-sunch(T....{}}
。通过列表初始化,构造匿名
sunch
对象,并用括号中的三元组
初始化(CheckLuaValue(),void(),0)
。在lambda版本中,三元组中的fcn针对每个
参数
条目进行计算。类似地,对于三元组的最终序列,计数器
(..,++i).
。第二个lambda示例收缩三元组。可以进行设计,因为大括号中的计算是有序的(与函数参数列表不同)这不是UB因为函数参数求值没有指定的顺序吗?我会使用一个(临时)数组:
别名{(…,++I)}
@Xeo它不是UB:当使用
{…}
时,顺序是定义的,即使它导致函数调用。请注意,
参数
为空时,您的建议将失败(请求零大小的数组)。啊,很高兴知道。在扩展之前,通过使用一个伪
0
可以很容易地修复零大小写。使用它会给我一个链接器
错误:未定义对“MyNamespace::午餐::午餐(int,int)”的引用
(其中
int,int
是扩展的模板类型)代码建议这样描述:声明一个具有可变模板成员的结构,
sunch{template-sunch(T....{}}
。通过列表初始化,构造匿名
sunch
对象,并用括号中的三元组
初始化(CheckLuaValue(),void(),0)
。在lambda版本中,三元组中的fcn针对每个
参数
条目进行计算。类似地,对于三元组的最终序列,计数器
(..,++i).
。第二个lambda示例收缩三元组。可以进行设计,因为大括号中的计算是有序的(与函数参数列表不同)