C++11新特性之自定义字面量

所属分类: 软件编程 / C 语言 阅读数: 87
收藏 0 赞 0 分享

1.示例

C++11新标准中引入了用户自定义字面量,也叫自定义后缀操作符,即通过实现一个后缀操作符,将申明了该后缀标识的字面量转化为需要的类型。考察如下代码:

long double operator"" _mm(long double x) { return x / 1000; }
long double operator"" _m(long double x) { return x; }
long double operator"" _km(long double x) { return x * 1000; }

int main()
{
cout << 1.0_mm << endl; //0.001
cout << 1.0_m << endl; //1
cout << 1.0_km << endl; //1000

return 0;
}

编译并运行:

0.001
1
1000

实际上,自定义字面量一般用于用户自定义的构造类型(结构体与类)。假如入我们有如下一个表示颜色的类。

struct RGBA
{
uint8_t r, g, b, a;
RGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a):r(r),g(g),b(b),a(a){}
};

如何书写类RGBA的字面量值呢,我们需要实现自定义后缀操作符。

RGBA operator"" _RGBA(const char* str, size_t size)
{
const char* r = nullptr, *g = nullptr, *b = nullptr, *a = nullptr;
for (const char* 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)
{
return RGBA(atoi(r),atoi(g),atoi(b),0);
}
else
{
return RGBA(atoi(r), atoi(g), atoi(b),atoi(a));
}
}

这里需要注意的是后缀操作符函数根据C++ 11 标准,只有下面参数列表才是合法的:

char const *
unsigned long long
long double
char const *, size_t
wchar_t const *, size_t
char16_t const *, size_t
char32_t const *, size_t

最后四个对于字符串相当有用,因为第二个参数会自动推断为字符串的长度。例如:

size_t operator"" _len(char const * str, size_t size)
{
return size;
}

int main()
{
cout << "mike"_len <<endl; //结果为4

return 0;
}

完成自定义后缀操作符函数后,我们可以使用自定义字面量来表示一个RGBA的对象了。

//输出运算符重载
ostream& operator<<(ostream& os,const RGBA& color)
{
return os<<"r="<< (int)color.r<<" g="<< (int)color.g<<" b="<< (int)color.b<<" a="<< (int)color.a<<endl;
}

int main()
{
//自定义字面量来表示RGBA对象
cout << "r255 g255 b255 a40"_RGBA << endl;
return 0;
}

程序编译运行输出:

r=255 g=255 b=255 a=40

总体来说,用户自定义字面量为代码书写带来了极大的便利。在实现自定义后缀操作符函数,后缀建议使用下划线开头,不宜使用非下划线的用户自定义字符串常量,否则编译器会发出警告。因为如果重用形如2019UL这样的字面量,后缀"UL"与C++的类型"后缀"相同,无疑会引起一些混乱。

以上就是C++11新特性之自定义字面量的详细内容,更多关于c++ 自定义字面量的资料请关注脚本之家其它相关文章!

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多