如何用百度搜自己做的网站,大理装饰公司做网站,电子商务网站软件建设,公司在线网站制作系统看可变参数模板代码时常会遇到省略号的使用#xff0c;这类奇特的“...”出现位置还不固定#xff0c;容易引起困惑。C最近一直不用都快废了#xff0c;在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧#xff0c;表示“…看可变参数模板代码时常会遇到省略号的使用这类奇特的“...”出现位置还不固定容易引起困惑。C最近一直不用都快废了在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧表示“参数包”在参数名称的右侧意为将参数包逐项展开。
参数包声明
一般在可变参数类模板或可变参数函数模板的定义时会在参数名称的左边添加省略号以表示“参数包”
templatetypename... Arguments class vtclass;vtclass vtinstance1;
vtclassint vtinstance2;
vtclassfloat, bool vtinstance3;
vtclasslong, std::vectorint, std::string vtinstance4;
template typename... Arguments returntype functionname(const Arguments... args);
template typename... Arguments returntype functionname(Arguments... args);
template typename... Arguments returntype functionname(Arguments... args);
template typename... Arguments returntype functionname(Arguments*... args);
当然类模板和函数模板也可以限定一个以上参数的情形限定多个参数以此类推不赘述
template typename First, typename... Rest class classname;
template typename First, typename... Rest returntype functionname(const First first, const Rest... args); 参数包展开
一般在函数参数声明或者函数调用时在参数名称的右边添加省略号表示将参数包逐项展开
// v1 is NOT a function parameter pack:
template typename... Types void func1(std::vectorTypes... v1);// v2 IS a function parameter pack:
template typename... Types void func2(std::vectorTypes... v2);vectorint v1, v2, v3;
func1(v1, v2, v3);//compile err
func2(v1, v2, v3);//compile ok
这里注意省略号的位置虽然我们本意都是想展开参数包Types但实际code的意图到底是vectorTypes里面的Types参数有多个还是有多个vectorTypes显然应该是后者因为不存在templateclass T... class vector这样的形式只有标准库中的templateclass T class vector。因此前者编译错误。
函数调用也在参数名实参后面添加省略号以将实参展开
template typename First, typename... Rest void print(const First first, const Rest... rest) {cout first , ;print(rest...); // recursive call using pack expansion syntax
}templateclass...Args
void Emplace(Args... args) {Destory();Create(forwardArgs(args)...);
}
这里同样forward的省略号在整个forwardArgs(args)的右边而不是args...意为对每项args展开使用完美转发。
sizeof...运算符
最后还有一个特殊的sizeof...() 运算符与旧的 sizeof() 运算符无关会在可变模板参数中使用以在编译期获取参数个数
templatetypename... Arguments
void tfunc(const Arguments... args)
{constexpr auto numargs{ sizeof...(Arguments) };X xobj[numargs]; // array of some previously defined type Xhelper_func(xobj, args...);
}
C语言中的省略号
C中的省略号一般和可变参数宏一起使用该省略号不仅可以放在函数的参数列表中也可以放在宏定义中
#define SUM(...) sum_impl(__VA_ARGS__, ())
省略号在宏定义中表示一个可以接收任意数量参数的变参。而 __VA_ARGS__ 是一个预处理器的宏它表示传递给宏的省略号中的实际参数。至于可变参数宏如何使用参考我之前的这篇https://blog.csdn.net/brahmsjiang/article/details/79366432