C++11新特性之自定义字面量
1.示例
C++11新标准中引入了用户自定义字面量,也叫自定义后缀操作符,即通过实现一个后缀操作符,将申明了该后缀标识的字面量转化为需要的类型。考察如下代码:
longdoubleoperator""_mm(longdoublex){returnx/1000;}
longdoubleoperator""_m(longdoublex){returnx;}
longdoubleoperator""_km(longdoublex){returnx*1000;}
intmain()
{
cout<<1.0_mm<
编译并运行:
0.001
1
1000
实际上,自定义字面量一般用于用户自定义的构造类型(结构体与类)。假如入我们有如下一个表示颜色的类。
structRGBA
{
uint8_tr,g,b,a;
RGBA(uint8_tr,uint8_tg,uint8_tb,uint8_ta):r(r),g(g),b(b),a(a){}
};
如何书写类RGBA的字面量值呢,我们需要实现自定义后缀操作符。
RGBAoperator""_RGBA(constchar*str,size_tsize)
{
constchar*r=nullptr,*g=nullptr,*b=nullptr,*a=nullptr;
for(constchar*p=str;p!=str+size;++p)
{
if(*p=='r')r=p+1;
if(*p=='g')g=p+1;
if(*p=='b')b=p+1;
if(*p=='a')a=p+1;
}
if(r==nullptr||g==nullptr||b==nullptr)throw;
if(a==nullptr)
{
returnRGBA(atoi(r),atoi(g),atoi(b),0);
}
else
{
returnRGBA(atoi(r),atoi(g),atoi(b),atoi(a));
}
}
这里需要注意的是后缀操作符函数根据C++11标准,只有下面参数列表才是合法的:
charconst*
unsignedlonglong
longdouble
charconst*,size_t
wchar_tconst*,size_t
char16_tconst*,size_t
char32_tconst*,size_t
最后四个对于字符串相当有用,因为第二个参数会自动推断为字符串的长度。例如:
size_toperator""_len(charconst*str,size_tsize)
{
returnsize;
}
intmain()
{
cout<<"mike"_len<
完成自定义后缀操作符函数后,我们可以使用自定义字面量来表示一个RGBA的对象了。
//输出运算符重载
ostream&operator<<(ostream&os,constRGBA&color)
{
returnos<<"r="<<(int)color.r<<"g="<<(int)color.g<<"b="<<(int)color.b<<"a="<<(int)color.a<
程序编译运行输出:
r=255g=255b=255a=40
总体来说,用户自定义字面量为代码书写带来了极大的便利。在实现自定义后缀操作符函数,后缀建议使用下划线开头,不宜使用非下划线的用户自定义字符串常量,否则编译器会发出警告。因为如果重用形如2019UL这样的字面量,后缀"UL"与C++的类型"后缀"相同,无疑会引起一些混乱。
以上就是C++11新特性之自定义字面量的详细内容,更多关于c++自定义字面量的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。