0%

C++11新特性 - 用户定义字面量

C++11 的用户自定义字面量新特性

字面量

C++ 自带4种字面量:

  • 整形 123
  • 浮点型 12.3
  • 字符 '1'
  • 字符串 "123"

字面量又可添加后缀来表明具体类型:

  • 无符号整形(unsigned int): 123u
  • 长整形(long): 123l

在 C++03 中,我们可以定义一个浮点数height

1
double height = 3.4

那么,痛点来了,此处的 height 的单位是什么呢?米?厘米?又或是英尺?

在面对此类问题时,如果我们能编写如下代码,事情就会简单许多:

1
2
height = 3cm;
ratio = 3cm / 2mm; // ratio = (3 * 10) / 2;

用户自定义字面量

C++11允许用户自定义字面量后缀

1
2
3
4
5
6
long double operator"" _cm(long double x) {return x * 10;}
long double operator"" _m(long double x) {return x * 1000;}
long double operator"" _mm(long double x) {return x;}

auto height = 3.0_cm; // height = 30.0
auto length = 1.23_m; // length = 1230.0

如果使用这种写法,_cm, _m, _mm 等函数将在运行时被调用,如果希望在编译时就调用字面量后缀函数,则需要把函数定义为 constexpr,例如

1
constexpr long double operator"" _cm(long double x) {return x * 10;}

更进一步,我们甚至可以

1
2
3
4
5
6
7
8
9
// 注意,如果这里要定义函数为 constexpr
// 编译时需要使用 c++14 标准(-std=c++14)
int operator"" _bin(const char* s, size_t l) {
int ret = 0;
for (int i = 0; i < l; i++) ret = (ret << 1) | (s[i] - '0');
return ret;
}

int num = "110"_bin; // num = 6

自定义字面量的限制

C++11 只允许字面量后缀函数的参数为以下类型,即整数,浮点以及字符串:

  • unsigned long long
  • long double
  • char const*
  • char const*, std::size_t
  • wchar_t const*, std::size_t
  • char16_t const*, std::size_t
  • char32_t const*, std::size_t

返回值则无类型限制