spdlog中的完美转发

本文探讨了c++日志库spdlog如何利用c++11的完美转发特性,通过示例解释了完美转发在工厂函数中的应用,以及如何通过std::make_shared实现参数的原样传递。同时,通过创建类Data及其工厂函数,验证了完美转发在处理不同构造函数时的匹配效果。
摘要由CSDN通过智能技术生成

 

 

spdlog是一个c++实现的日志库,代码中大量使用了c++11的特性,并且只需要头文件就可以使用,十分值得使用和研究。

下面这段代码是spdlog中的一个工厂函数,用来创建一个新的logger,里面用到了c++11之后才支持的完美转发。

template<typename Sink, typename... SinkArgs>
static std::shared_ptr<spdlog::logger> create(std::string logger_name, SinkArgs &&... args)
{
    auto sink = std::make_shared<Sink>(std::forward<SinkArgs>(args)...);
    auto new_logger = std::make_shared<spdlog::logger>(std::move(logger_name), std::move(sink));
    details::registry::instance().initialize_logger(new_logger);
    return new_logger;
}

SinkArgs这个可变长度的模板参数是完美转发的目标,定义成&&,右值引用。std::make_shared会在构造Sink对象时将SinkArgs传递给Sink的构造函数,SinkArgs需要使用std::forward传递,这样就能将参数原原本本的传递给Sink的构造函数ÿ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值