美文网首页
[C++11阅读][2-4-1]用户自定义字面量

[C++11阅读][2-4-1]用户自定义字面量

作者: 凌霄阁2010 | 来源:发表于2020-06-12 00:05 被阅读0次

字面量

C/C++一直有字面量这个概念,比如32L是个long、19.0f是float、0x32是16进制整数。

用户自定义字面量

在C++11中,用户可以自定义字面量了,语法上是重载引号运算符实现的,引号后面接个空格,接个下划线,再接用户自定义的符号。
看一个例子,用_C表示一个RGBA的字面量,实例化两个匿名对象出来。

#include <cstdlib>
#include <iostream>
using namespace std;
typedef unsigned char uint8;
struct RGBA {
        uint8 r;
        uint8 g;
        uint8 b;
        uint8 a;
        RGBA(uint8 R, uint8 G, uint8 B, uint8 A = 0):
                r(R), g(G), b(B), a(A){}
};
RGBA operator "" _C(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 == nullptr || g == nullptr || b == nullptr)
                throw;
        else if (a == nullptr)
                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));
}
std::ostream & operator << (std::ostream & out, RGBA & col) {
        return out << "r: " << (int)col.r
                << ", g: " << (int)col.g
                << ", b: " << (int)col.b
                << ", a: " << (int)col.a << endl;
}
void blend(RGBA && col1, RGBA && col2) {
        cout << "blend " << endl << col1 << col2 << endl;
}
int main() {
        blend("r255 g240 b155"_C, "r15 g255 b10 a7"_C);
}
// -std=c++11
/*
blend 
r: 255, g: 240, b: 155, a: 0
r: 15, g: 255, b: 10, a: 7
*/

不同类型的规则

虽然重载的符号是引号,但可以支持四种类型,支持的类型是整数、浮点数、字符串、字符。

  1. 如果字面量是整型数,那么字面量操作符函数只可接受unsigned long long或者const char为其参数。当数太大,unsigned long long无法容纳该字面量的时候,编译器会自动将该字面量转化成以\0为结束符的字符串,用调用以const char为参数的函数版本。
  2. 如果字面量为浮点型,则字面量操作符函数只可接受long double或者const char为其参数。const char规则跟整形一样,太长的用这个函数。
  3. 如果字面量为字符串,则字面量操作符只可接受(const char*, size_t)为参数,已知长度的字符串。
  4. 如果字面量为字符,则字面量操作符只可接受一个char为参数。

函数声明格式

声明字面量操作符函数时,有以下几点需要注意。

  1. operator ""与用户自定义后缀之间必须有空格。
  2. 后缀建议以下划线开始,不带下划线时会被编译器警告。
    g++实测并没有被警告。

相关文章

  • [C++11阅读][2-4-1]用户自定义字面量

    字面量 C/C++一直有字面量这个概念,比如32L是个long、19.0f是float、0x32是16进制整数。 ...

  • 用户自定义字面量

    在c++11中,运行用户自定义字面量了。即你可以通过一个后缀来标识字面量是什么类型。 自定义函数返回类型 oper...

  • ES6系列 (三)模板字面量

    特性 模板字面量实现字符串插值 模板字面量实现多行字符串 模板字面量实现可重用的模板 理解标记模板字面量如何自定义...

  • golang类型字面量

    类型字面量又被称作“未命名类型” 基本上除自定义类型、预定义类型外都是类型字面量。 以下都是类型字面量: gola...

  • 运营公众号,你懂阅读量了吗

    什么是阅读量?就是你的文章有人在看,这就是阅读量。 文章总阅读量=已关注用户阅读量+未关注用户阅读量; 已关注用户...

  • 字面量

    字面量: 1、数字字面量: 1.1、整数: 10进制:普通数字就是十进制 8进制:以0开头(...

  • 字面量

  • 字面量

    字面量 常见字面量的默认类型 可以通过typealias修改字面量的默认类型 swift自带类型之所以能够通过字面...

  • 字面量

    字面量(Literal) 上面代码中的10、false、"Jack"就是字面量 常见字面量的默认类型 public...

  • 字面量

    在读《编写高质量iOS与OS X代码的52个有效方法》这本书时,才发现了一个自己一直遗漏的问题,NSArr...

网友评论

      本文标题:[C++11阅读][2-4-1]用户自定义字面量

      本文链接:https://www.haomeiwen.com/subject/ymkitktx.html