c++ 字面量

字面量

  • 自定义字面量

自定义字面量

字面量(literal)是指在源代码中写出的固定常量,它们在 C++98 里只能是原生类型,如:

"hello",字符串字面量,类型是 const char[6]
1,整数字面量,类型是 int
0.0,浮点数字面量,类型是 double
3.14f,浮点数字面量,类型是 float
123456789ul,无符号长整数字面量,类型是 unsigned long

C++11 引入了自定义字面量,可以使用 operator"" 后缀 来将用户提供的字面量转换成实际的类型。C++14 则在标准库中加入了不少标准字面量。下面这个程序展示了它们的用法:

#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
	cout << "i * i = " << 1i * 1i<< endl;
	cout << "Waiting for 500ms"<< endl;
	this_thread::sleep_for(500ms);
	cout << "Hello world"s.substr(0, 5)<< endl;
}

输出是:

i * i = (-1,0)
Waiting for 500ms
Hello

上面这个例子展示了 C++ 标准里提供的帮助生成虚数、时间和 basic_string 字面量的后缀。其所在的命名空间是:

std::literals::complex_literals
std::literals::chrono_literals
std::literals::string_literals

要在自己的类里支持字面量也相当容易,唯一的限制是非标准的字面量后缀必须以下划线 _打头。比如,假如我们有下面的长度类:

struct length {
double value;
enum unit {
	metre,
	kilometre,
	millimetre,
	centimetre,
	inch,
	foot,
	yard,
	mile,
};
static constexpr double factors[] =
	{1.0, 1000.0, 1e-3,
	1e-2, 0.0254, 0.3048,
	0.9144, 1609.344};
explicit length(double v, unit u = metre)
{
	value = v * factors[u];
}
};
length operator+(length lhs, length rhs)
{
	return length(lhs.value + rhs.value);
}
// 可能有其他运算符

我们可以手写 length(1.0, length::metre) 这样的表达式,但估计大部分开发人员都不愿意这么做吧。反过来,如果我们让开发人员这么写,大家应该还是基本乐意的: 1.0_m + 10.0_cm

要允许上面这个表达式,我们只需要提供下面的运算符即可:

length operator"" _m(long double v)
{
	return length(v, length::metre);
}
length operator"" _cm(long double v)
{
	return length(v, length::centimetre);
}

你可能感兴趣的:(C++,c++,开发语言)