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的构造函数ÿ