天天看点

C++的骚操作(一)

用户定义的字面量(user-defined literal)

  1. operator “” [suffix name], 举例:operator “” _b8();
  2. 可用于普通函数,也可用于模板函数
  3. 举个例子,实现八进制的字面量,编译时会计算出对应的整数值
// Example program
#include <iostream>
#include <string>

constexpr int ipow(int x, int n)
{
    return n > 0 ? x * ipow(x, n - 1) : 1;
}

template <char a>
constexpr int b8_helper()
{
    return a - '0';
}

template <char a, char b, char... tail>
constexpr int b8_helper()
{
    return (int)(a - '0') * ipow(8, sizeof...(tail) + 1) + b8_helper<b, tail...>();
}

template <char... digits>
constexpr int operator"" _b8()
{
    return b8_helper<digits...>();
}

int main()
{
    int a = 2121474_b8;
    std::cout << a << std::endl;
}
           
  1. 用户只能定义字面量后缀,而不能定义前缀
  2. 对于非整数的字符串字面量,需要加上双引号隔离后缀
  3. 用户定义的字面量后缀最好以下划线开头,标准库保留了所有不以下划线开头的后缀
  4. 对于普通函数,字面量的值会传递给参数;对于模板,则会传给模板参数

继续阅读