spdlog中的完美转发
spdlog是一个c++实现的日志库,代码中大量使用了c++11的特性,并且只需要头文件就可以使用,十分值得使用和研究。
下面这段代码是spdlog中的一个工厂函数,用来创建一个新的logger,里面用到了c++11之后才支持的完美转发。
1 | template<typename Sink, typename... SinkArgs> |
SinkArgs这个可变长度的模板参数是完美转发的目标,定义成&&,右值引用。std::make_shared会在构造Sink对象时将SinkArgs传递给Sink的构造函数,SinkArgs需要使用std::forward传递,这样就能将参数原原本本的传递给Sink的构造函数,当Sink有不同的构造函数时还能自动匹配。
我们来写代码验证一下。
首先写一个有多种构造函数的类Data,每个构造函数里都不干啥,只是打印一条信息。
1 | class Data |
然后我们为Data写一个工厂函数,像下面这个样子,也比较简单,只是创建一个指针再返回出来。
1 | template <typename T, typename ...Args> |
测试代码如下。
1 | int main(int argc, const char *argv[]) |
运行之后输出如下,就和预想的一样。
1 | Data() |
大家可能注意到,CreateData返回的并不是裸指针,而是make_shared出来的shared_ptr,下面是make_shared的代码,有没有觉得很眼熟呢?
1 | template<typename _Tp, typename... _Args> |
没错,make_shared在为shared_ptr构建对象时也用到了完美转发,如果我们再给Data包装一个具有引用计数功能的管理类,就很像是shared_ptr的实现了。
参考链接:https://zhuanlan.zhihu.com/p/275075782
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 竹山一叶!
💡 准备购买云服务器 / 域名来搭建或部署站点?
通过下面的链接下单,通常能领到新用户专属优惠,也能小额支持本站持续更新:
阿里云(返现) | 腾讯云 2核2G 99元/年 | 腾讯云 云产品特惠
评论













