Boost开发指南-4.12utility

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.mzph.cn/news/57705.shtml

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

相关文章

瞬态电压抑制器(TVS)汽车级 SZESD9B5.0ST5G 工作原理、特性参数、封装形式

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…

蓝牙模块产品认证-国际市场准入准则之BQB认证认证基础知识

蓝牙模块产品认证-国际市场准入准则之BQB认证认证基础知识 前言 BQB认证介绍 Bluetooth SIG Bluetooth SIG 由八大无线通讯行业巨头成立的一家公司&#xff0c;专门负责蓝牙规格开发、 技术推广及资格认证工作,成立于1998年。 Bluetooth SIG拥有Bluetooth Trademarks 免费地授…

ChatGPT⼊门到精通(2):ChatGPT 能为我们做什么

⼀、雇佣免费的⼲活⼩弟 有了ChatGPT后&#xff0c;就好⽐你有了好⼏个帮你免费打⼯的「⼩弟」&#xff0c;他们可以帮你做很多 ⼯作。我简单总结⼀些我⽬前使⽤过的⽐较好的基于ChatGPT的服务和应⽤。 1、总结、分析 当我们在阅读⼀些⽂章和新闻的时候&#xff0c;有的⽂章写…

4.9 已建立连接的TCP,收到SYN会发生什么?

1. 客户端的 SYN 报文里的端口号与历史连接不相同 此时服务端会认为是新的连接要建立&#xff0c;于是就会通过三次握手来建立新的连接。 旧连接里处于 Established 状态的服务端最后会怎么样呢&#xff1f; 服务端给客户端发消息了&#xff1a;客户端连接已被关闭&#xff…

【Go 基础篇】深入探索:Go语言中的切片遍历与注意事项

嗨&#xff0c;Go语言学习者&#xff01;在我们的编程旅程中&#xff0c;切片&#xff08;Slice&#xff09;是一个极其重要的工具。它可以帮助我们处理各种类型的数据&#xff0c;从而让我们的代码更加灵活和高效。本文将围绕Go语言中切片的遍历方法以及在遍历时需要注意的事项…

Scrum敏捷研发迭代式开发

Scrum是一个迭代式增量软件开发过程&#xff0c;是敏捷方法论中的重要框架之一。它通常用于敏捷软件开发&#xff0c;包括了一系列实践和预定义角色的过程骨架。Scrum中的主要角色包括Scrum主管&#xff08;Scrum Master&#xff09;、产品负责人&#xff08;Product Owner&…

Android ---使用Jenkins 打包release版本不能安装或者安装后不显示APP

大家在用 Jenkins的时候&#xff0c;是不是会觉得很爽&#xff0c;因为他在用的过程中&#xff0c;是无脑的&#xff0c;毕竟一键触发&#xff01;&#xff01;&#xff01;&#xff01; 这边记录一个昨天&#xff0c;今天遇到的一个坑货问题&#xff0c;别人提交了所有代码&am…

ElasticSearch基础知识汇总

文章目录 前言一、认识ElasticSearch1.正向索引和倒排索引2. MySql与ElasticSearc3.IK分词器 二、ES索引库操作1.mapping映射属性2.索引库的CRUD 三、ES文档库操作 前言 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基…

3.RabbitMQ 架构以及 通信方式

一、RabbitMQ的架构 RabbitMQ的架构可以查看官方地址 可以看出RabbitMQ中主要分为三个角色&#xff1a; Publisher&#xff1a;消息的发布者&#xff0c;将消息发布到RabbitMQ中的ExchangeRabbitMQ服务&#xff1a;Exchange接收Publisher的消息&#xff0c;并且根据Routes策…

抖店商品怎么让达人带货?说下找达人技巧和寄样后的操作,可收藏

我是王路飞。 找达人带货的玩法是公认出单快、易爆单、长久稳定的出单方式。 虽然新手可能感觉要给达人佣金&#xff0c;自己利润会降低&#xff0c;但是这种玩法可以让你快速入门&#xff0c;且能长久玩下去。 尤其是现在抖音直播间的产品全都是来自抖音小店的&#xff0c;…

YOLO目标检测——花蕊分类检测数据集下载分享

花蕊分类检测数据集共同7300图片&#xff0c;103类别&#xff0c;分别放在103个文件夹中&#xff0c;可应用于&#xff1a;植物学研究、花卉市场和园艺业、智能农业、视觉搜索引擎、等等 数据集点击下载&#xff1a;YOLO花蕊分类检测数据集7300图片102种类别.rar

多旋翼飞控底层算法开发系列实验 | 多旋翼动力系统设计实验3

多旋翼动力系统设计实验3 01/多旋翼动力系统简介​​​​​​​ 多旋翼无人机的动力系统通常包括螺旋桨、电机、电调以及电池。动力系统是多旋翼最重要的组成部分&#xff0c;它决定了多旋翼的主要性能&#xff0c;如悬停时间、载重能力、飞行速度和飞行距离等。动力系统的部件…

Elasticsearch 集成--Flink 框架集成

一、Flink 框架介绍 Apache Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Apache Spark 掀开了内存计算的先河&#xff0c;以内存作为赌注&#xff0c;赢得了内存计算的飞速发展。 但是在其火热的同时&#xff0c;开发人员发现&#xff0c;在 Spark …

EasyExcel自定义字段对象转换器支持转换实体和集合实体

文章目录 1. 实现ObjectConverter2. 使用3. 测试3.1 导出excel3.2 导入excel 1. 实现ObjectConverter package com.tophant.cloud.common.excel.converters;import cn.hutool.json.JSONUtil; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.enums.…

设计模式—原型模式(Prototype)

目录 一、什么是原型模式&#xff1f; 二、原型模式具有什么优缺点吗&#xff1f; 三、有什么缺点&#xff1f; 四、什么时候用原型模式&#xff1f; 五、代码展示 ①、简历代码初步实现 ②、原型模式 ③、简历的原型实现 ④、深复制 ⑤、浅复制 一、什么是原型模式&…

c++之指针

总结性质 我们如何在一个函数中获取数组的长度&#xff1a; 我们都知道&#xff0c;在main函数中我们获得数组的长度只需要使用sizeof&#xff08;a&#xff09;/sizeof&#xff08;a【0】&#xff09;即可获得&#xff0c;但当我们把一个数组传入到方法时&#xff0c;c默认把…

重生c++系列之类与对象(中篇)

好的继上期&#xff0c;我们今天带来c类与对象系列的继续学习。 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员 函数。 …

pyqt5-快捷键QShortcut

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *""" 下面示例揭示了&#xff0c;当关键字绑定的控件出现的时候&#xff0c;快捷键才管用&#xff0c; 绑定的控件没有出现的时候快捷键无效 """…

vscode使用anaconda自带的python环境在终端运行时报错

目录 具体报错内容官方翻译报错讲人话解决方法 具体报错内容 CommandNotFoundError: Your shell has not been properly configured to use conda activate. If your shell is Bash or a Bourne variant, enable conda for the current user with$ echo ". E:\Anaconda/e…

无涯教程-Android - Activity

Activity代表具有用户界面的单个屏幕&#xff0c;就像Java的窗口或框架一样。Android Activity 是ContextThemeWrapper类的子类。 如果您使用过C&#xff0c;C或Java编程语言&#xff0c;那么您一定已经看到您的程序从 main()函数开始。与之非常相似&#xff0c;Android系统以 …