欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

好用的C++ string Format“函数”介绍

时间:2022-09-03 10:39:07|栏目:C代码|点击:

我这个人总是喜欢在写代码时追求极致,比如总是纠结于变量的命名,内存的消耗,执行的效率,接口的便捷性,代码的可扩展性。。。但很多时候需要在他们之间做取舍,这就导致我在编码时经常陷入僵局,唉。。。真是程序员的可悲,为此几年前我还专门将自己的CSDN签名改成了现在这样。

今天我又带来一个函数,相比网上其他版本效率更高(不存在额外拷贝问题),使用更便捷(无需预先分配缓存)。

起初我设计的函数如下:相比网上其他的Format,特点是降低了内存消耗,也提升了使用的便捷性,但带来了执行效率的下降,而更严重的是存在多线程隐患,不推荐使用。

const std::string& StrUtil::Format(const char* pszFmt, ...)
{
	va_list body;
	va_start(body, pszFmt);
	int nChars = _vscprintf(pszFmt, body);
 
    std::mutex mtx;
    mtx.lock();
    static std::string str; // 非线程安全,因此下面使用互斥锁
	str.resize(nChars + 1);
	vsprintf((char*)str.c_str(), pszFmt, body);
    mtx.unlock();
	
    va_end(body);
 
	return str; // 非线程安全
}

然后,我又设计出了第二个Format方案。上个方案之所以在函数内部使用了static变量,是为了解决函数返回后变量“str”销毁的问题,这也是能让一个Format好用的关键问题所在——“如何能在函数返回后,构建好的字符串仍然能够在内存短暂驻留”,如下(利用临时对象特性保证内存短暂驻留)

 
 
/*************************************************************************
** Desc     : 好用的格式化字符串“函数”,使用方法:
**				printf(StrUtil::Format("%,%s", "hello", "world").c_str());
** Param    : [in] pszFmt
**          : [in] ...
** Return   : std::string
** Author   : xktesla
*************************************************************************/
class StrUtil
{
public:
	struct Format : std::string
	{
	public:
		Format(const char* pszFmt, ...)
		{
			va_list body;
			va_start(body, pszFmt);
			int nChars = _vscprintf(pszFmt, body);
			this->resize(nChars + 1);
			vsprintf((char*)this->c_str(), pszFmt, body);
			va_end(body);
		}
 
	private:
		Format() = delete;
		Format(const Format&) = delete;
		Format& operator=(const Format&) = delete;
	};
};

上一篇:c++primer:变量和基本类型详解

栏    目:C代码

下一篇:C语言结构体的具体使用方法

本文标题:好用的C++ string Format“函数”介绍

本文地址:http://www.codeinn.net/misctech/212653.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有