剖析C++中的常量表达式与省略号的相关作用

2020-01-06 14:22:09于海丽

或为:


template<typename ... Arguments> class classname;

请注意本文使用的是显示在第一个例子中约定(该省略号附加于typename).
在前面的示例中,Arguments 是参数包。类 classname 可以接受参数数目可变,例如以下示例:


template<typename... Arguments> class vtclass;

vtclass< > vtinstance1;
vtclass<int> vtinstance2;
vtclass<float, bool> vtinstance3;
vtclass<long, std::vector<int>, std::string> vtinstance4;

通过使用可变参数模板类定义,您还可以要求至少一个参数。


template <typename First, typename... Rest> class classname; 

以下是可变参数模板函数语法的基本示例:


template <typename... Arguments> returntype functionname(Arguments... args);

如下一节“了解可变参数模板”所示,Arguments 参数包展开使用。
variadic 模板函数语法还可能有其他形式,包括不限制于:


template <typename... Arguments> returntype functionname(Arguments&... args); 
template <typename... Arguments> returntype functionname(Arguments&&... args);
template <typename... Arguments> returntype functionname(Arguments*... args);

还允许使用类似 const 的说明符:


template <typename... Arguments> returntype functionname(const Arguments&... args); 

按照可变参数模板类的定义,您可以创建需要至少一个参数的函数:

 

复制代码
template <typename First, typename... Rest> returntype functionname(const First& first, const Rest&... args);

 

 

 

可变模板使用 sizeof...() 运算符(与更早的 sizeof() 运算符不相关):


template<typename... Arguments>
void tfunc(const Arguments&... args)
{
  const unsigned numargs = sizeof...(Arguments);

  X xobj[numargs]; // array of some previously defined type X

  helper_func(xobj, args...);
}

更多有关省略号位置
过去,本文介绍了定义参数装箱和展开“在参数名称左侧的省略号位置,它表示参数,包,并在参数名称右侧,其展开参数装箱到单独的名称”。这是技术上为 true,但可能会费一番功夫在转换代码。请考虑: