大家好,本篇文章主要讲的是好用的C++stringFormat“函数”介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
我这个人总是喜欢在写代码时追求极致,比如总是纠结于变量的命名,内存的消耗,执行的效率,接口的便捷性,代码的可扩展性。。。但很多时候需要在他们之间做取舍,这就导致我在编码时经常陷入僵局,唉。。。真是程序员的可悲,为此几年前我还专门将自己的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++ string Format“函数”介绍
基础教程推荐
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01