C++11中的字面量操作符
在C++11中,有个很有意思的功能,就是可以自定义字面量
#include<iostream>
using namespace std;
typedef unsigned char uint8;
struct RGBA
{
uint8 r,g,b,a;
RGBA(uint8 R,uint8 G,uint8 B,uint8 A=0):r(R),g(G),b(B),a(A){}
};
RGBA operator "" _COLOR(const char* col,size_t n)
{
const char*p=col;
const char* end=col+n;
const char* r,*g,*b,*a;
r=g=b=a=nullptr;
for(;p!=end;++p)
{
if(*p=='r')r=p;
else if(*p=='g')g=p;
else if(*p=='b')b=p;
else if(*p=='a')a=p;
}
if(!r || !g || !b)
throw;
else if(!a)
return RGBA(atoi(r+1),atoi(g+1),atoi(b+1));
else
return RGBA(atoi(r+1),atoi(g+1),atoi(b+1),atoi(a+1));
}
ostream& operator<<(ostream & os,RGBA && color)
{
os<<"RGBA: "<<(int)color.r<<" "<<(int)color.g<<" "<<(int)color.b<<" "<<(int)color.a;
return os;
}
struct Watt
{
unsigned int v;
};
Watt operator"" _W(unsigned long long v)
{
return {(unsigned int)v};
}
int main()
{
Watt temp=12_W;
cout<<"r255 g234 b99 a32"_COLOR<<endl;
}
RGBA: 255 234 99 32
上面的
T operator"" xxx()
就是字面量操作符,其中""
和xxx
中间有个空格不能忘记,这个函数的作用是,它能识别以xxx
结尾的字面量,并把变成T
类型的值。
不过上面函数的形参有一定要求:如果字面量是整数+xxx
,那么形参只能是unsigned long long
;如果字面量是浮点数+xxx
,那么形参只能是long double
;如果字面值是字符,那么形参只能是char
;如果字面值是字符串+xxx
,那么形参只能是const char *
和size_t
;