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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。