可变参数 - C++11中的语法特性(10)

2019-09-28  本文已影响0人  要厉害的

允许模版定义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中组建之间消息众多,根据不同情况传递不同个数的参数,使用这种方式可以极大提升编码的灵活性。

上一篇下一篇

猜你喜欢

热点阅读