2. 自定义format

发布时间:2023-07-11 00:17:23

前言

C++20引入了std::format,然而20距离普及估计还要一段时间。

替代方案为fmt库。

然而有的时候对性能要求不高、不想引入依赖的的情况下,可以自己实现。比如日志、sql语句。

将格式字符串定义为静态也可以大大减少开销,降低对性能的影响。

实现

有两种办法,粗略估计第二种办法效率应该更高。

  1. 可变参数函数模板
#include 
#include 

namespace YQ {
using std::string;

template<typename... Args>
string format (const string &fmt, Args...args)
{
	size_t len = snprintf (NULL, 0, fmt.c_str(), args...);
	char buf[len + 1];
	snprintf (buf, sizeof (buf), fmt.c_str(), args...);
	return buf;
}

}

snprintf()在空间不够时会返回需要的字节数(见man手册)。

  1. C语言变参函数
#include 
#include 
#include 
#include 

namespace YQ {


using std::unique_ptr;
using std::string;
string format (const string &fmt, ...)
{
	char *buf;
	va_list args;
	va_start (args, fmt);
	vasprintf (&buf, fmt.c_str(), args);
	va_end (args);
	
	unique_ptr<char, decltype (free) * > auto_freed (buf, free);
	
	return string (buf);
}

}

vasprintf()asprintf()的变参版本,它解析变参,分配好C字符串并返回给我们,由我们自己释放。

unique_ptr来自动释放C字符串,这样就可以直接返回了(调用std::string的拷贝构造函数)。

decltype用于函数类型时,返回的是函数类型。为了得到函数指针,我们再给它加上一个*

你可能感兴趣的:(项目小技巧,c++,c++,开发语言)