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.001cout << 1.0_m  << endl; //1cout << 1.0_km << endl; //1000return 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; //结果为4return 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++的类型"后缀"相同,无疑会引起一些混乱。


参考文献

[1]深入理解C++11[M].3.8用户自定义字面量.P110-P113
[1]C++11:用户定义字面量

C++11 用户自定义字面量相关推荐

  1. c++语言自定义操作符,C++11新特性之自定义字面量

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

  2. (7)JavaScript字面量

    一.字面量 字面量(literal)是用于表达一个固定值的表示法,又叫常量. 通俗的理解,字面就是所见即所得,js 程序执行到代码中的字面量,会立即知道它是什么类型的数据,值是多少. 可以用于表示固定 ...

  3. Go字面量(字面常量)

    目录 字面量 字面量类型 整型字面量 浮点型字面量 复数类型字面量 字符型字面量 字符串字面量 字面量 编程语言源程序中表示固定值的符号叫做字面量,也称字面常量.一般使用裸字符序列来表示不同类型的值. ...

  4. C++——新类型与原始字面量(原始字符串)

    1.1新类型 C++11新增类型long long和unsigned long long,以支持64位(或者更宽)整型:新增了char16_t和char32_t以支持16位和32为字符表示:还新增了原 ...

  5. 数据表示字面量整型字面量

    数据表示字面量整型字面量 编写程序,首先面对的是数据.在程序中,数据该如何表示出来?根据表示的方式不同,数据通常有两种表示方式:直观表示和指代表示.本章将详细讲解这两种表示方式本文选自明明白白学C#大 ...

  6. Javascript:必须知道的Javascript知识点之“字面量和对应类型”

    代码示例 1 var date1 = new Date(2013,1,1); 2 var date2 = new Date(2013,1,1); 3 date1 == date2; //执行结果为fa ...

  7. java字面量 方法区_(一)java的内存模型

    程序计数器(私有) 程序计数器:"是一个非常小的内存空间,用来保证程序依次执行",它可以看作是当前线程所执行的字节码的行号指示器 由于java虚拟机的多线程是通过线程轮流切换并分配 ...

  8. objective-c 2.0的字面量Literals

    obj-c 2.0增加了许多核心对象字面量的简单语法,向ruby学习吗? 直接上代码: #import <Foundation/Foundation.h>int main(void){@a ...

  9. JavaScript基础09-day11【原型对象、toString()、垃圾回收、数组、数组字面量、数组方法】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

最新文章

  1. locust===官方说明文档,关于tasks
  2. 正则表达式实现将html文本转换为纯文本格式(将html字符串转换为纯文本方法)
  3. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
  4. matlab 两幅图不同,如何把两个不同M文件的图放在一起
  5. [转]Ubuntu SCIM 输入法不能光标跟随的解决
  6. sqlserver删除指定列失败
  7. java的格式化时间工具类
  8. 服务器端打开excel 检索 COM 类工厂 错误: 80070005
  9. Blazor University (9)组件 — 代码生成 HTML 属性
  10. 计算器排html页面,htmltest~计算器界面的实现
  11. Python查看、修改pip install 默认使用的pip库
  12. Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 2:解码数据
  13. win10系统hp笔记本开机黑屏一段时间解决方法
  14. 五笔字典86版wubi拆字图编码查询
  15. 乌镇·Conflux CTO伍鸣:让公链的“不可能三角”成为可能
  16. 学生php作业,作业作业作业作业作业
  17. vue虚拟DOM原理
  18. 70道Dubbo面试题及答案(最新整理)
  19. UltraEdit小众用法
  20. mysql开启数据库审计

热门文章

  1. nginx模块使用详解
  2. Linux上 MongoDB 实现远程连接并设置账号密码
  3. 中英金融科技论坛:监管科技增长较快 区块链等新技术挑战监管能力
  4. EJB3.0高速入门项目开发步骤
  5. 初始----python数字图像处理--:环境安装与配置
  6. Best Practices for AWS Security Using CloudCheckr
  7. Windows 8实例教程系列 - 开篇
  8. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...
  9. Linux启动服务详解
  10. 关于新版VLC无法看RTSP的视频的问题-转