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
}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号