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

 更新时间:2021年12月28日 14:12:58   作者:xktesla  
大家好,本篇文章主要讲的是好用的C++ string Format“函数”介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

我这个人总是喜欢在写代码时追求极致,比如总是纠结于变量的命名,内存的消耗,执行的效率,接口的便捷性,代码的可扩展性。。。但很多时候需要在他们之间做取舍,这就导致我在编码时经常陷入僵局,唉。。。真是程序员的可悲,为此几年前我还专门将自己的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++ string Format“函数”介绍的文章就介绍到这了,更多相关C++ string Format内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++详细讲解函数调用与Struct和CLass的区别

    C++详细讲解函数调用与Struct和CLass的区别

    主调函数使用被调函数的功能,称为函数调用。在C语言/C++中,只有在函数调用时,函数体中定义的功能才会被执行,下面让我们详细来了解
    2022-05-05
  • C++中Semaphore内核对象用法实例

    C++中Semaphore内核对象用法实例

    这篇文章主要介绍了C++中Semaphore内核对象用法实例,有助于深入了解信号量(Semaphore)的基本用法,需要的朋友可以参考下
    2014-10-10
  • 一文读懂C++ 虚函数 virtual

    一文读懂C++ 虚函数 virtual

    这篇文章主要介绍了C++ 虚函数 virtual的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • c语言没有try catch的替代方案

    c语言没有try catch的替代方案

    这篇文章主要介绍了c语言没有try catch的替代方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • C++实现正态随机分布的方法

    C++实现正态随机分布的方法

    本篇介绍了,使用c++实现正态随机分布的实现方法。需要的朋友参考下
    2013-05-05
  • VC6.0常见编译错误提示附解决方法

    VC6.0常见编译错误提示附解决方法

    这篇文章主要介绍了VC++6.0编译过程中常遇到的一些错误提示并给出了错误原因与分析,需要的朋友尅参考下
    2013-07-07
  • C语言kmp算法简单示例和实现原理探究

    C语言kmp算法简单示例和实现原理探究

    这篇文章主要介绍了C语言kmp算法简单示例和实现原理探究,本文用简洁的语言说明KMP算法的原理,并给出了示例,需要的朋友可以参考下
    2014-09-09
  • C++中引用和const关键字介绍

    C++中引用和const关键字介绍

    大家好,本篇文章主要讲的是C++中引用和const关键字介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++实现线性表顺序存储的示例代码

    C++实现线性表顺序存储的示例代码

    这篇文章主要为大家详细介绍了C++实现线性表顺序存储的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-03-03
  • C语言自制测色弱找方块游戏的示例代码

    C语言自制测色弱找方块游戏的示例代码

    这篇文章主要介绍了基于C语言自制测色弱找方块的游戏。该游戏是仿照最近网上流行的找方块游戏编写的,可玩性还是挺高的,感兴趣的可以了解一下
    2022-12-12

最新评论