首页 > 编程语言 >C++11 用户定义字面量

C++11 用户定义字面量

时间:2024-02-10 20:33:21浏览次数:29  
标签:11 std 字面 chrono C++ operator 14

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
}

标签:11,std,字面,chrono,C++,operator,14
From: https://www.cnblogs.com/3to4/p/18013031

相关文章

  • P1102 A-B 数对
    原题链接解法一:二分搜素首先我们知晓A-B=C,那么A=B+C,我们只需要遍历数组中的每一个元素然后在数组中搜素a[i]+c的值是否存在即可。Code #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+5;lla[N];intmain(){intn,c;l......
  • 【C++】STL string类例题新思路记录(编写一个程序,告诉用户输入的句子包含多少个元音字
    题干:编写一个程序,告诉用户输入的句子包含多少个元音字母。 方案一:1、创建一个普通函数,依次传入5个元音字母对查找字符串进行检测。2、函数通过依次传入的单个元音字母,循环查找整个字符串最后返回统计值。1#include<string>2#include<iostream>3usingnamespace......
  • P1182 数列分段 Section II
    原题链接作为二分答案的入门题非常合适。很典型的二分答案。但是这题有一个坑点,left的值不能设为0这种确定的值,而是应该设为这个数组的最大值。这道题警示了我二分答案的一个重要前提:确定合理的二分区间。题解首先,判断单调性,对于一个最大值mid,如果能够满足check(),那么mid+1,mid+......
  • 向Linux看齐!Win 11发布重磅更新:原生支持sudo命令
    微软于今天向WindowsInsider项目成员发布了Windows11Build26052预览版更新,首次在Windows系统中引入了对于原生sudo命令的支持。对于不熟悉Linux系统的用户来说,sudo命令可能有些陌生。但对于Linux用户和开发者而言,sudo命令无疑是日常工作中最常用的命令之一。sudo命令可以让......
  • 代码随想录算法训练营第十六天| 104.二叉树的最大深度 559.n叉树的最大深度 111.二
    104.二叉树的最大深度  题目链接:104.二叉树的最大深度-力扣(LeetCode)n叉树也一样思路:我的普通递归方法classSolution{public:intdepth(TreeNode*node,intd){intl=0,r=0;if(node->left==NULL&&node->right==NULL)returnd;if(node-......
  • C++Primer
    前言固然,轻薄短小的书籍乍见之下让所有读者心情轻松,但如果舍弃太多应该深入的地方不谈,也难免令人行止失据,进退两难。……作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度。起步固然可从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只......
  • C++OpenCV 按之前图片名称保存图片
    C++OpenCV按之前图片名称保存图片://图片地址cv::Stringpattern="./path/*.jpeg";//可以使用cv::glob函数来获取匹配模式的文件路径列表std::vector<cv::String>file_paths;cv::glob(pattern,file_paths);for(size_ti=0;i<file_paths.size();i++){//......
  • c++ OpenCV 读取某个文件夹下的所有图片
    方案一:将文件夹中图像遍历到vector中#include<vector>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>std::vector<cv::Mat>ReadImage(cv::Stringpattern){std::vector<cv::String>fn;cv::glob(pattern,fn,false);......
  • Windows 10/11等 IPV4 IPV6 DNS 最多设置多少个?
    Windows10/11等IPV4IPV6DNS最多设置多少个?理论知识:在Windows10系统中,IPv4和IPv6的DNS设置是通过网络配置进行的。对于DNS服务器地址的数量,Windows10并没有明确限制用户设置的数量。然而,从实际操作性和网络配置的常规需求来看,通常情况下,大多数用户会设置一到两个DNS服务......
  • Win7 Win8.1 Win10 Win11 本人经验
    Win7  优点:特殊软件兼容性强,缺点:内存修改文件不断增大  没办法有特殊软件要使用 那就Win7吧,至少不会像Win10那样强制更新,自动隔离删除你的文件。Win8.1优点:内存小,速度快。  没啥毛病,开始菜单下载那个StartISBack就好。没有深色模式在那个时代就是好东西......