C++学习笔记----Strings与String View(10)-- 非编译时格式化字符串常量

1、非编译时格式化字符串常量

        上一篇我觉得对于格式化字符串这个问题说得已经够清楚了,但发现还是有一些细节要交待,对于格式化字符串,首先要保证它为常量,即不可修改,string_view类型也不行,前面要用constexpr来进行修饰,才能保证其为常量。如果对于不同的情况,需要输出的格式提示语是不一样的怎么办呢,使用print()之类的还行吗?答案是不行,要用新的函数了,std::vprint_unicode()或者std::vprint_nonunicode(),传入的正常参数也不能直接用数值或者文本,要使用std::make_format_args()来进行格式化,由于本笔记不是讲解函数的细节用法,更注重的是学到C++语言的精髓,所以对于可以通过查手册的方式获得的知识一般都不进行详细阐述。好的,我们来看一下示例:

import std;
using namespace std;
enum class Language { English, Dutch};
string_view GetLocalizedFormat(Language language)
{
	switch (language) {
	case Language::English: return "Numbers: {0} and {1}.";
	case Language::Dutch:	return "Getallen: {0} en {1}.";
	}
}
int main()
{
	int i1{ 1 };
	int i2{ 2 };
	int& ir1{ i1 };
	int& ir2{ i2 };
	Language language{ Language::English };
	vprint_unicode(GetLocalizedFormat(language),make_format_args(ir1,ir2));
	println("");
	language = Language::Dutch;
	vprint_unicode(GetLocalizedFormat(language), make_format_args(ir1, ir2));
	return 0;
}

结果如下:

Numbers: 1 and 2.
Getallen: 1 en 2.

与所期待的是一致的,当然,如果我们坚持用

println(GetLocalizedFormat(language), 1, 2);

编译时会报错:error C7595: “std::basic_format_string<char,int,int>::basic_format_string”: 对即时函数的调用不是常量表达式。与上一篇文章一样,不再赘述。

2、非编译时常量格式化字符串错误处理

        我们已经知道,format()、print()、println()对于格式化字符串,如果有错误,在编译时就会报错,不会等到执行时,而对于vprint_unicode()、vprint_nonunicode()如果编译时正常,而在执行时报错的话,则需要我们主动捕获错误,以使程序运行更稳定,下面我们看一下示例:

import std;
using namespace std;
int main()
{
	try {
		int if1{ 42 };
		int& ifr1{ if1 };
		vprint_unicode("An integer: {5}", make_format_args(ifr1));
	}
	catch (const format_error& caught_exception) {
		println("{}", caught_exception.what());
	}
	return 0;
}

执行结果:

Argument not found.

程序内容就不多做解释了吧,格式化字符中要求index为5的参数,而参数中只提供了一个index为0的参数,所以捕获到Argument not found的错误,与预期一致。

到现在为止,输出参数的外围内容已经介绍的差不多了,下一篇我们就会进入到输出参数中真正的丰富的格式化内容,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王俊山IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值