C++11 用户定义字面量

C++11 用户定义字面量

C++11引入了一项功能,称为用户自定义字面量(user-defined literals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。

内置字面量

C++ 自带4种字面量:

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

字面量又可添加后缀来表明具体类型,建议大写:

  • 无符号整形(unsigned int):123U
  • 长整形(long):123L

标准库定义了一些字面量后缀:

字面量后缀运算符 含义
operator""if
operator""i
operator""il
(C++14)
表示纯虚数的 std::complex 字面量 (函数)
operator""h(C++14) 表示小时的 std::chrono::duration 字面量 (函数)
operator""min(C++14) 表示分钟的 std::chrono::duration 字面量 (函数)
operator""s(C++14) 表示秒的 std::chrono::duration 字面量 (函数)
operator""ms(C++14) 表示毫秒的 std::chrono::duration 字面量 (函数)
operator""us(C++14) 表示微秒的 std::chrono::duration 字面量 (函数)
operator""ns(C++14) 表示纳秒的 std::chrono::duration 字面量 (函数)
operator""y(C++20) 表示特定年的 std::chrono::year 字面量 (函数)
operator""d(C++20) 表示月内日期的 std::chrono::day 字面量 (函数)
operator""s(C++14) 转换字符数组字面量为 basic_string (函数)
operator""sv(C++17) 创建一个字符数组字面量的字符串视图

用户定义字面量

用户定义字面量(UDL)允许程序员在代码中定义自己的字面量,这些字面量的类型可以是任何用户定义的类型。

为了定义一个用户自定义字面量,必须定义一个名为operator ""的函数,后面紧跟着一个下划线和字面量后缀。使用时在字面量后加上这个下划线后缀即可。

注意

  • 区别于标准库定义的字面量后缀运算符是不带下划线的 operator""X ,而用户定义字面量后缀运算符是带下划线的 operator""_X
  • 可以加上 constexpr 来避免函数调用
  • 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
long double constexpr operator""_cm(long double x) {
	return x * 10; 
}

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 main() {
    int num = "110"_bin; // 6
    int mm = 12.3_cm;    // 123
}
posted @ 2024-02-10 20:24  3的4次方  阅读(79)  评论(0编辑  收藏  举报