您当前所在位置:首页攻略C++ 20 中的std::format及其在编译期的字符串格式检查

C++ 20 中的std::format及其在编译期的字符串格式检查

更新:2024-04-08 08:46:08编辑:游戏资讯归类:攻略

C++ 20 中引入的std::format是一个十分实用的工具,它的最大特点是能够在编译期检查字符串的格式是否正确,而且使用方法简单,只需要像普通函数一样传参即可。

std::format

std::format源自一个著名的开源库{fmt}。在C++ 20之前,{fmt}需要为每个字符串字面量创建不同的类型才能实现编译期格式检查。为了简化这一流程,{fmt}提供了一个FMT_STRING宏。

{fmt}

在C++ 20中引入了consteval后,使用起来更加简便。与以前的constexpr函数不同,consteval函数在任何情况下都强制编译期求值。std::format利用consteval函数在编译期执行代码来检查字符串参数的格式。

consteval

由于std::format本身不能是consteval函数,为了实现编译期的格式检查,引入了一个辅助类型std::format_string。这样字符串实参就能隐式转换为std::format_string,从而利用consteval函数在编译期执行代码来检查字符串的格式。

std::format_string

在实现一个简单版的format中,可以检查字符串中{}的数量是否与参数的个数相同。format_string的构造函数充当了隐式转换函数,它是一个consteval函数。若字符串中{}的数量不对,则代码会执行到throw这一行,由于throw语句不能在编译期求值,会导致编译错误,从而实现了在编译期检查出字符串的格式错误。

format实现

在format函数的参数中使用format_string ...>,而非直接写成format_string ,这是因为模板实参推导不会考虑隐式转换。为了解决这个问题,C++ 20提供了一个工具std::type_identity,它能在模板实参推导中建立非推导语境,从而正常地匹配到隐式转换。

std::type_identity

以上就是电脑114游戏给大家带来的关于C++ 20 中的std::format及其在编译期的字符串格式检查全部内容,更多攻略请关注电脑114游戏。

电脑114游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

《荒野大镖客2》彩蛋耶稣会传教士在哪里 如意馄饨app