Boost开发指南-4.12utility

news2025/1/20 19:14:03

utility

utility库不是一个有统一主题的Boost库,而是包含了若干个很小但有用的工具。

本章开头介绍的noncopyable.swap都曾经被归类在utility库里(现在则属于core库),此外utility还包括其他很多个实用类,如 base_from_member、compressed_pair、checked_delete等。

BOOST_BINARY

BOOST_BINARY提供一组宏,用于实现简单的二进制常量表示,它类似于C++14标准里的二进制字面量“0bxxx”的用法。

BOOST_BINARY的定义位于<boost/utility/binary.hpp>中,也可以通过<boost/utility.hpp>间接包含,即:

#include<boost/utility/binary.hpp> //或者
#include<boost/utility.hpp>

它使用boost.preprocessor预处理元编程工具将一组或多组01数字在编译期展开成为一个八进制数字。每个数字组之间需要用空格分隔,每组可以容纳1个到8个0/1数字。

这里特别要注意的是,数字组的长度一定不能超过8个,由于预处理器宏展开的限制,嵌套层次太深会导致无法通过编译,报出一大堆错误。

cout << hex << showbase;
cout << BOOST_BINARY(0110) << endl;
cout << BOOST_BINARY(0110 1101) << endl;
cout << BOOST_BINARY(10110110 01) << endl;
cout << bitset<5>(BOOST_BINARY(0110)) << endl;

除了最基本最通用的 BOOST_BINARY宏之外,本组件还包含形如 BOOST_BINARY_XX的宏,其中的xx是标准的整数扩展,如 u(unsigned int)、UL(unsigned long)等,用以支持需要特定整数类型的地方。例如,long long对应的宏是 BOOST_BINARY_LL。

cout << BOOST_BINARY_UL(101 1001) << endl;
long long x = BOOST_BINARY_LL(1101);
cout << x << endl;

BOOST_BINARY宏提供了很好的初始化操作方法,在某些需要按位操作的情况下特别有用,比如使用std::bitset。而且 BOOST_BINARY宏都是在编译期展开的,没有任何运行时开销。

BOOST_CURRENT_FUNCTION

GCC编译器在C89的__FILE__和__LINE__之外定义了一些扩展宏,其中的__PRETTY_FUNCTION__宏可以表示函数名称,VC、intel C等编译器也定义有类似的宏,而C99标准则定义了__func__宏以实现同样的功能。

BOOST_CURRENT_FUNCTION宏使用变通的方法为C++补充了这个功能,更具可移植性。

用法

为了使用 BOOST_CURRENT_FUNCTION宏,需要包含<boost/current_function.hpp>,即

#include<boost/current_fuction.hpp>

只需要在代码中使用BOOST_CURRENT_FUNCTION宏,就可获得包含该宏的外围函数名称,它表现为一个包含完整函数声明的编译期字符串。如果BOOST_CURRENT_FUNCTION宏不处于任何函数作用域之内,则行为依编译器而不同。

double func()
{
	cout << BOOST_CURRENT_FUNCTION << endl;
	return 0.0;
}

string str = BOOST_CURRENT_FUNCTION;      //错误用法,不能用在函数作用域外

int main()
{
	cout << str << endl;
	cout << __FUNCTION__ << endl;
	cout << BOOST_CURRENT_FUNCTION << endl;
	func();
}

程序使用GCC编译后运行结果如下:

top level
main
int main()
double func()

实现原理

读者可能会惊讶于BOOST_CURRENT_FUNCTION宏的奇特魔力,其实 BOOST_CURRENT_FUNCTION宏并不神秘。它的实现代码实际上相当地简单,仅仅是针对各种编译器把编译器特定的宏定义为 BOOST_CURRENT_FUNCTION,因此它的能力完全依赖于编译器。

例如对于GCC,BOOST_CURRENT_FUNCTION是:

#define BOOST_CURRENT_FUCTION __PRETTY_FUNCTION__

虽然BOOST_CURRENT_FUNCTION的功能和实现都很简单,但它的确为函数名称的显示提供了一个通用的解决办法,在配合抛出异常或者输出诊断日志时非常有用。

代码示例

采用LLVM-clang-cl编译

#include <bitset>
#include <iostream>
using namespace std;

#include <boost/utility.hpp>

//
void case1()
{
	cout << hex << showbase;
	cout << BOOST_BINARY(0110) << endl;
	cout << BOOST_BINARY(0110 1101) << endl;
	cout << BOOST_BINARY(10110110 01) << endl;
	cout << bitset<5>(BOOST_BINARY(0110)) << endl;

	cout << BOOST_BINARY_UL(101 1001) << endl;
	long long x = BOOST_BINARY_LL(1101);
	cout << x << endl;

}

//
#include <boost/current_function.hpp>

double func()
{
	cout << BOOST_CURRENT_FUNCTION << endl;
	return 0.0;
}

string str = BOOST_CURRENT_FUNCTION;      //错误用法,不能用在函数作用域外

void case2()
{
	cout << str << endl;
	cout << __FUNCTION__ << endl;
	cout << BOOST_CURRENT_FUNCTION << endl;
	func();
}

//

int main()
{
	case1();
	case2();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/943375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统复习总结5

操作系统复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《操作系统原理》 - 何静媛编著. 西安电子科技大学出版社《操作系统考研复习指导》2024年 - 王道论坛组编. 电子工业出版社 本文主要内容为&#xff1a;输入输出管理&#xff1b; 计算机系统…

经典卷积网络

目录 一、经典神经网络出现的时间线​编辑 二、LeNet 三、AlexNet 四、VGGNet 五、InceptionNet 六、ResNet 总结&#xff1a; 一、经典神经网络出现的时间线 二、LeNet 背景&#xff1a;LeNet由Yann LeCun于1998年提出&#xff0c;卷积网络开篇之作。 解释&#xff1…

Error: PostCSS plugin autoprefixer requires PostCSS 8 问题解决办法

报错&#xff1a;Error: PostCSS plugin autoprefixer requires PostCSS 8 原因&#xff1a;autoprefixer版本过高 解决方案&#xff1a; 降低autoprefixer版本 执行&#xff1a;npm i postcss-loader autoprefixer8.0.0

拓世AI | 智能家居比朋友还贴心,开启人类生活全面智能的一天

每个时代都有它的标志性技术&#xff0c;在21世纪&#xff0c;无疑是人工智能。当日光悄悄溜进窗台&#xff0c;一切都在静默中苏醒&#xff0c;你的家已经开始了新的一天。不再是单纯的墙壁、屋顶和家具&#xff0c;它现在是一个“生命体”&#xff0c;倾听你的需求&#xff0…

ssm会议管理系统源码和论文

ssm会议管理系统源码和论文087 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&…

android Double.valueOf 报java.lang.NumberFormatException

执行到 Double.valueOf 时&#xff0c;报NumberFormatException&#xff0c;在中文&#xff0c;英文时没问题&#xff0c;切换例如 法语 才会出现。是因为执行&#xff1a; df.format((double) fileS / 1024)时&#xff0c;中文、因为都正常返回值是22.75 但法语时会返回22,…

【附安装包】Vm虚拟机安装Linux系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;VMware硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.Vm虚拟机15.5下载链接&#xff1a;https://pan…

IDEA如何打jar包

IntelliJ IDEA如何打jar包 1、无maven打jar包 1、编写好Java项目后&#xff0c;点击File --> Project Structure&#xff0c;然后按照以下图示步骤进行打包操作 若项目还存在一些额外的文件&#xff0c;可通过以下方式&#xff0c;将文件添加到jar包中。 //如果我们将项目…

hive lateral view 实践记录

正确插入数据&#xff1a; create table tmp.test_lateral_view_movie_230829(movie string,category array<string>);insert into tmp.test_lateral_view_movie_230829 select 《战狼3》,array(战争,动作,剧情); insert into tmp.test_lateral_view_movie_230829 selec…

Python 面试:异常处理机制

格式&#xff1a; 继承Exception实现自定义异常。 注意&#xff1a;这里是继承Exception类&#xff0c;而不是BaseException类&#xff0c;因为继承BaseException可能会导致捕获不到自定义异常。 class MyException(Exception):passtry:raise MyException(my salary is too…

【校招VIP】java语言考点之动态代理相关

考点介绍&#xff1a; 在校招面试中&#xff0c;动态代理相关内容经常出现。AOP的拦截功能是由java中的动态代理来实现的&#xff0c;AOP的源码中用到了两种动态代理来实现拦截切入功能:&#xff1a;jdk动态代理和cglib动态代理。两种方法同时存在&#xff0c;各有优劣。 『ja…

高忆管理:美股涨、欧股涨、中概股大爆发!这一夜,市场经历了什么

当地时间周一&#xff0c;投资者等待本周即将公布的多项重要数据的同时&#xff0c;继续消化美联储年内再加息一次的预期&#xff0c;危险偏好有所提高&#xff0c;推进美国三大股指集体上涨。到收盘&#xff0c;道指涨0.62%&#xff0c;标普500指数涨0.63%&#xff0c;纳指涨0…

【案例分享】接入层设备安全配置

关注微信公众号&#xff1a;厦门微思网络 接入层设备安全配置案例 接入层作为园区网络的边界&#xff0c;为各种终端接入网络&#xff0c;需要防止非法的终端和用户进入网络。此外&#xff0c;接入层设备还承载二层流量转发的功能&#xff0c;需要对二层流量的转发行为进行控制…

SpringBoot整合Redis使用

目录 1、redis介绍2、redis五种数据类型2.1 String&#xff08;字符串&#xff09;2.2 List&#xff08;列表&#xff09;2.3 Set&#xff08;集合&#xff09;元素唯一不重复2.3 Hash&#xff08;哈希&#xff09;2.4 zSet&#xff08;有序集合&#xff09; 3、SpringBoot整合…

2023年下半年抖音小店运营全攻略

每年618过后&#xff0c;7、8月份&#xff0c;都是电商淡季。 尤其是服装类目&#xff0c;很多商家都是直接躺平。 但是到了9月份&#xff0c;一是换季&#xff0c;二是碰上开学季&#xff0c;电商旺季就开始来了&#xff01; 尤其是服装、文具、户外运营这些类目&#xff0…

激活潜能:探索职场中的自我效能感之道

引言&#xff1a;自我效能感的定义与重要性 自我效能感&#xff0c;简而言之&#xff0c;是个体对自己能够成功完成某项任务的信心。这种信心不仅影响我们的思考方式和情感&#xff0c;还影响我们的行为和动机。在职场中&#xff0c;高自我效能感的人往往更有动力&#xff0c;…

解决报错Java: 非法字符: ‘\ufeff‘

方法一&#xff1a;直接remove BOM&#xff0c;再重新启动程序。 方法二&#xff1a;用notpad打开&#xff0c;点击编码为utf-8格式&#xff0c;保存。

7个ChatGPT提示让你摆脱工作烦躁,实现加薪、获得认可、享受工作、融入、优雅离职等

人生的大部分时间都在工作&#xff0c;如果你不喜欢自己的工作&#xff0c;那简直就是一场灾难。人生苦短&#xff0c;没有必要被糟糕的工作环境困扰太久。无论你是否考虑换工作&#xff0c;你现在都可以借助ChatGPT来改善你的工作状况。 使用以下提示能让你的工作变得更加愉…

【高等数学基础知识篇】——导数与微分

本文仅用于个人学习记录&#xff0c;使用的教材为汤家凤老师的《高等数学辅导讲义》。本文无任何盈利或者赚取个人声望的目的&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 文章目录 一、导数与微分的基本概念1.1 导数的基本概念1.2 微分的基本概念1.3 连续、可导、…

<C++> 多态

1.多态的概念 多态是指同一个函数在不同情况下表现出不同的行为。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 举个例子&#xff1a;比如买票…