上一篇:《深入理解C++11》笔记–非受限联合体
本篇继续介绍第三章的内容:用户自定义字面量。字面量是什么意思呢?例如:
int a = 0; // a为变量,0为字面量
自定义字面量就是我们自己规定一个字面量格式来作为一些值的定义,具体代码如下:
class Example{
public:
Example(int i, int j):a(i), b(j){}
int geta() const {return a;}
int getb() const {return b;}
private:
int a = 0;
int b = 0;
};
// 根据字符串内容分割出字面量中的内容
Example operator ""_Ex(const char* data, size_t len)
{
const char* begin = data;
const char* a = data;
const char* b = nullptr;
for (size_t i = 0; i < len; ++i, ++begin)
{
if (' ' == *begin)
{
b = data + i;
}
}
Example result(atoi(a), atoi(b));
return result;
}
void out(const Example& ex)
{
std::cout << ex.geta() << "," << ex.getb() << std::endl;
}
int main(){
out("1 2"_Ex); // 1,2
return 0;
}
除了字符串类型的自定义字面量,还可以定义整形或者浮点型的字面量:
class Example{
public:
Example(int i):a(i){}
int geta() const {return a;}
private:
int a = 0;
};
Example operator ""_Ex(unsigned long long input)
{
return (int)input;
}
void out(const Example& ex)
{
std::cout << ex.geta() << std::endl;
}
int main(){
Example ex = 1_Ex;
out(2_Ex); // 2
return 0;
}
这样我们在测试接口或者对类对象初始化的时候就可以直接使用字面量,而不用写一堆的对象初始化代码。看起来很有意思,但是也有一些规则:
- 如果字面量是整形数,那么字面量操作符函数只能接受unsigned long long以及const char* 类型的参数。当字面量超出unsigned long long长度限制时,会当做const char* 来处理。例如:
out(222222222222222222222222222222_Ex);
由于没有实现const char*类型的字面量操作符,所有编译失败。 - 如果字面量为浮点数,那么字面量操作符只能接受long double以及const char* 类型的参数。超出长度的规则和上面一样。
- 如果字面量为字符串,则只能接受const char*, size_t类型的参数。
- 如果字面量为字符,则只能接受一个char的参数。
另外,还有一点需要注意,后缀请使用下划线形式,否则会编译不过,因为有可能会和C++中的一些后缀冲突(书里说的是会警告,xcode中声明会有警告,使用就会报错)。书里还说定义字面量操作符时,”“和后缀需要有空格,实测不需要也行。