c++11: 用户定义字面量

c++11带来了很多新特性,其中用户定义字面量就是一个。

注:该特性vs2013不支持, vs2014和gcc4.9支持。这里推荐一个在线的c++编译网站,用来测试一些代码还是蛮有用的,并且它支持超多的语言像python、lua等都支持。网址在这里 http://ideone.com/

先看下面的代码:

#include <iostream>
using namespace std;

struct Color
{
    int r, g, b;
};

//定义的字面量转换函数
//在gcc编译器下注意双引号与后面的_c之间必须有一个空格 vs2014没有该要求
//_c可以任意取名字 一般最好用下划线(_)开头 避免与系统定义的冲突(比方说长整形后缀 L等))
Color operator"" _c(const char* str, size_t n)
{
    //字面常量格式为 r数字g数字b数字
    unsigned char r = 0, g = 0, b = 0;
    for (size_t i = 0; i < n; i++)
    {
        if (str[i] == ‘r‘) r = (unsigned char)atoi(&str[i + 1]);
        else if (str[i] == ‘g‘) g = (unsigned char)atoi(&str[i + 1]);
        else if (str[i] == ‘b‘) b = (unsigned char)atoi(&str[i + 1]);
    }

    return {r, g, b};
}

int main() {
    //这样使用 将把“r11g12b13”转换成Color结构体 字符串必须用引号括起来 后面必须跟一个_c(前面自定义)的后缀 且与前面的字符串不予许有其他包括空格等字符
    Color c = "r11g12b13"_c;
    //输出结果是R11 G12 B13
    cout << "R" << c.r << " G" << c.g << " B" << c.b << endl;
    return 0;
}

以上是其中一种使用方法 我们来看另外一个例子 将说明这个特性的方便之处。

比方说重量单位 有克(g),千克(kg),吨(t) 因此如果使用了该特性,就可以在常量后面跟一个相应的重量单位。

//所有都返回千克(kg)

long double operator"" _g (long double g)
{
    return g/1000.0;
}

long double operator"" _kg(long double kg)
{
   return kg;
}

long double operator"" _t(long double t)
{
    return t*1000.0;
}

//接下来我们就可以在代码中很方便的定义使用重量
long double egg = 50_k;
long double beauty = 45_kg;
long double car = 1.5_t;
//以上代码会很方便的转换成千克单位

但是,该特性有参数类型和参数个数限制,根据标准,只有以下是合法的:

1 const char*
2 unsigned long long
3 long double
4 const char*, size_t
5 const wchar_t*, size_t
6 const char16_t*, size_t
7 const char32_t*, size_t

以上后面的四种版本传入参数直接包含了字符串的长度。

通过上面可以看到,const char*似乎提供了两个版本(第一行和第四行)一种没有字符串长度,一种有,其实他们是有区别的,不要搞混淆。

第一行的这种后缀前面的字符串不能加引号,但是必须是数字(十进制或者十六进制的形式),第四行的这种必须加引号。如:

const char* operator"" _ll(const char* s)
{
    return s;
}

const char* operator"" _cc(const char* s, size_t len)
{
    return s;
}

//这样使用可以
123_ll
0x123a_ll
"123"_cc
"0x123a"_cc
"abc"_cc

//以下使用方式则不行
abc_ll
123a_ll //注意与上面的0x123_ll区别
"123"_ll //不能使用引号
123_cc
abc_cc
时间: 2024-10-13 19:00:55

c++11: 用户定义字面量的相关文章

JSON运用——PHP中使用json数据格式定义字面量对象的方法

目前,在PHP中是不支持字面量命名法. 前端的小伙伴都知道,在JS中用字面量定义一个对象的方法可以如下: var o = { 'name' : 'Tom' , 'url' : 'www.baidu.com' }; alert(o.name); 但在PHP中这么定义对象: $o = { "name" : "Tom", "url" : "www.baidu.com" }; 则会报错 Parse error: syntax erro

Scala函数字面量

Scala中函数为头等公民,你不仅可以定义一个函数然后调用它,而且你可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量.下面的例子为一个简单的函数字面量(参考整数字面量,3 为一整数字面量). (x :Int ) => x +1 这是个函数字面量,它的功能为+1. 符好 => 表示这个函数将符号左边的东西(本例为一个整数),转换成符号右边的东西(加1). 函数字面量为一个对象(就像3是个对象),因此如果你愿意的话,可以把这个函数字面量保持在一个变量中.这个变量

C++11 用户自定义字面量

[1]为什么引入用户自定义字面量? 在C/C++程序中,常常会使用结构体或者类来创造新的类型,以满足实际的需求. 比如,在进行科学计算时,用户可能需要用到复数(通常会包含实部和虚部两部分). 对于颜色,用户通常会需要一个四元组(三原色及Alpha). 对于奥运会组委会,他们则常常会需要七元组(标示来自七大洲的状况)等等. 而当用户想声明一个自定义类型的“字面量”(literal)时,尤其显得麻烦.如下示例: 1 #include <iostream> 2 using namespace std

C++11中的小细节--字符串的原始字面量

原始字面量很容易理解,即不进行转义的完整字符串. 最近看了看Python,其中讲到了原始字符串. Both string and bytes literals may optionally be prefixed with a letter ‘r’ or ‘R’; such strings are called raw strings and treat backslashes as literal characters. As a result, in string literals, ‘\U

Scala函数字面量简化写法

Scala提供了多种方法来简化函数字面量中多余的部分,比如前面例子中filter方法中使用的函数字面量,完整的写法如下: (x :Int ) => x +1 首先可以省略到参数的类型,Scala可以根据上下文推算出参数的类型,函数定义可以简化为: (x) => x +1 这个函数可以进一步去掉参数的括号,这里的括号不起什么作用: x => x +1 Scala 还可以进一步简化,Scala允许使用”占位符”下划线”_”来替代一个或多个参数,只要这个参数值函数定义中只出现一次,Scala编

第六讲 Block块语法及Block与数组的排序,ios字面量的使用(源代码上传)

1 #import <Foundation/Foundation.h> 2 3 4 #import "Student.h" 5 6 int c =200; 7 int main(int argc, const char * argv[]) { 8 @autoreleasepool { 9 /* 10 ------------------------------------- 11 定义block变量的四种方法 12 -----------------------------

ES6模板字面量

前面的话 JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系,通过一些全新的方法来解决类似的问题.本文将详细介绍ES6模板字面量 基本用法 模板字面量是增强版的字符串,它用反引号(`)标识 let message = `Hello world!`; console.log(message); // "Hello world!" conso

字面量和构造函数

字面量和构造函数 JavaScript中的字面量模式更加简洁.有表现力,而且在定义对象时不容易出错.本章将会讨论字面量,包括对象.数组和正则表达式字面量,以及为什么字面量要比等价的内置构造函数(如Object().Array()等)要更好.本章还会介绍JSON格式,JSON是使用数组和对象字面量的形式定义的一种数据交换格式.本章还会讨论自定义构造函数,包括如何强制使用new以确保构造函数正确执行. 为了方便使用字面量而不是构造函数,本章还会补充一些知识,比如内置包装构造函数Number().St

Swift数组字面量

1 可以用一个数组字面量来初始化一个数组,简单地把一个或多个值放在一起就可以了.数组字面量的写法是一行用逗号隔开的值,并在行的两端用一对方括号包起来: 2 [value 1, value 2, value 3] 3 4 下面的例子创建了一个存放String类型值,名为shoppingList的数组: 5 var shoppingList: String[] = ["Eggs", "Milk"] 6 // shoppingList 用两个元素完成初始化 7 根据Str