允许模版定义0到多个参数,这样函数的参数可以灵活设置。
定义语法如下:
template<class/typename... Args>
返回值 函数名称(Args ... args)
函数名称(args...)
常见应用在打印多个参数上,或者递归计算里,示例如下:
void print() {
//空的时候打印
cout << "no item" << endl;
}
template <class T, class ... Args>
void print(T head, Args ... args) {
cout << head << endl;
print(args...);
}
void main(){
print(1,2,3); //依次打印,实际的函数原型为print(int,int,int);
}
以ceph中的代码为例,在创建消息时大量使用了可变参数模版
template<class T, typename... Args>
friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
不同的消息会传递不同的参数,比如(mds/Server.cc)某些消息接受者需要回复消息给发送者,消息包括被处理的消息和处理返回值等2个参数。
server->reply_client_request(mdr, make_message<MClientReply>(*mdr->client_request, r));
再比如osd的回复消息(osd/replicated_backend.cc)包含了多达9个参数。
auto m = make_message<MOSDRepOp>(req_id, whoami, spg_t{pgid, pg_shard.shard}, hoid, CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK, map_epoch, min_epoch, tid, ver);
ceph中组建之间消息众多,根据不同情况传递不同个数的参数,使用这种方式可以极大提升编码的灵活性。