C++ Boost TypeTraits库使用详解

目录
  • 一、说明
  • 二、库Boost.TypeTraits

一、说明

反省是重点中的重点,泛型在实践中贯穿工程的始终。以下库支持泛型编程。无需详细了解模板元编程即可使用这些库。 Boost.TypeTraits 提供了检查类型属性的函数。 Boost.EnableIf 可以与 Boost.TypeTraits 一起使用,例如,根据函数的返回类型重载函数。 Boost.Fusion 使创建异构容器成为可能——其元素可以具有不同类型的容器。

Boost.TypeTraits

Boost.EnableIf

Boost.Fusion

二、库Boost.TypeTraits

类型具有泛型编程所利用的不同属性。 Boost.TypeTraits 库提供了确定和更改类型属性所需的工具。

从 C++11 开始,Boost.TypeTraits 提供的一些函数可以在标准库中找到。您可以通过头文件 type_traits 访问这些函数。然而,Boost.TypeTraits 提供了额外的功能。

示例 48.1。确定类型类别

#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
  std::cout.setf(std::ios::boolalpha);
  std::cout << is_integral<int>::value << '\n';
  std::cout << is_floating_point<int>::value << '\n';
  std::cout << is_arithmetic<int>::value << '\n';
  std::cout << is_reference<int>::value << '\n';
}

Example48.1

示例 48.1 调用了几个函数来确定类型类别。 boost::is_integral 检查一个类型是否是整数——它是否可以存储整数。 boost::is_floating_point 检查类型是否存储浮点数。 boost::is_arithmetic 检查类型是否支持算术运算符。并且 boost::is_reference 可用于确定类型是否为引用。

boost::is_integral 和 boost::is_floating_point 是互斥的。类型存储整数或浮点数。但是,boost::is_arithmetic 和 boost::is_reference 可以应用于多个类别。例如,整数和浮点类型都支持算术运算。

Boost.TypeTraits 中的所有函数都提供一个 true 或 false 值的结果。示例 48.1 为 is_integral<int> 和 is_arithmetic<int> 输出 true,为 is_floating_point<int> 和 is_reference<int> 输出 false。因为所有这些函数都是模板,所以在运行时不会处理任何事情。该示例在运行时的行为就像在代码中直接使用值 true 和 false 一样。

在示例 48.1 中,各种函数的结果是 bool 类型的值,可以直接写入标准输出。如果结果要由函数模板处理,则应将其作为类型而不是布尔值转发。

示例 48.2。 boost::true_type 和 boost::false_type

#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
  std::cout.setf(std::ios::boolalpha);
  std::cout << is_same<is_integral<int>::type, true_type>::value << '\n';
  std::cout << is_same<is_floating_point<int>::type, false_type>::value <<
    '\n';
  std::cout << is_same<is_arithmetic<int>::type, true_type>::value << '\n';
  std::cout << is_same<is_reference<int>::type, false_type>::value << '\n';
}

除了值,来自 Boost.TypeTraits 的函数还提供类型结果。 value 是一个 bool 值,type 是一个类型。就像只能设置为 true 或 false 的值一样,类型只能设置为两种类型之一:boost::true_type 或 boost::false_type。 type 允许您将函数的结果作为类型传递给另一个函数。

示例 48.2 使用了另一个来自 Boost.TypeTraits 的函数,称为 boost::is_same。此函数需要两种类型作为参数并检查它们是否相同。要将 boost::is_integral、boost::is_floating_point、boost::is_arithmetic 和 boost::is_reference 的结果传递给 boost::is_same,必须访问 type。然后将类型与 boost::true_type 或 boost::false_type 进行比较。然后再次读取 boost::is_same 的结果。因为这是一个布尔值,所以它可以写入标准输出。

示例 48.3。使用 Boost.TypeTraits 检查类型属性

#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
  std::cout.setf(std::ios::boolalpha);
  std::cout << has_plus<int>::value << '\n';
  std::cout << has_pre_increment<int>::value << '\n';
  std::cout << has_trivial_copy<int>::value << '\n';
  std::cout << has_virtual_destructor<int>::value << '\n';
}

Example48.3

示例 48.3 介绍了检查类型属性的函数。 boost::has_plus 检查类型是否支持运算符 operator+ 以及是否可以连接两个相同类型的对象。 boost::has_pre_increment 检查类型是否支持预递增运算符 operator++。 boost::has_trivial_copy 检查一个类型是否有一个平凡的复制构造函数。 boost::has_virtual_destructor 检查类型是否具有虚拟析构函数。

示例 48.3 显示 true 三次, false 一次。

示例 48.4。使用 Boost.TypeTraits 改变类型属性

#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost;
int main()
{
  std::cout.setf(std::ios::boolalpha);
  std::cout << is_const<add_const<int>::type>::value << '\n';
  std::cout << is_same<remove_pointer<int*>::type, int>::value << '\n';
  std::cout << is_same<make_unsigned<int>::type, unsigned int>::value <<
    '\n';
  std::cout << is_same<add_rvalue_reference<int>::type, int&&>::value <<
    '\n';
}

Example48.4

示例 48.4 说明了如何更改类型属性。 boost::add_const 添加常量到一个类型。如果类型已经是常量,则没有任何变化。代码编译没有问题,类型保持不变。

boost::remove_pointer 从指针类型中删除星号并返回指针引用的类型。 boost::make_unsigned 将带符号的类型转换为不带符号的类型。 boost::add_rvalue_reference 将类型转换为右值引用。

示例 48.4 将 true 写入标准输出四次。

到此这篇关于C++ Boost TypeTraits库使用详解的文章就介绍到这了,更多相关C++ Boost TypeTraits内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost Conversion超详细讲解

    目录 一.说明 二.示例和代码 三.更多示例代码 一.说明 Boost.Conversion 在头文件 boost/cast.hpp 中定义了转换运算符 boost::polymorphic_cast 和 boost::polymorphic_downcast.它们旨在更精确地处理类型转换——通常使用 dynamic_cast 完成. 库由两个文件组成.分别在boost/cast.hpp文件中定义了boost::polymorphic_cast和boost::polymorphic_downca

  • C++ Boost Parameter超详细讲解

    目录 一.说明 二.示例代码 一.说明 Boost.Parameter 使得将参数作为键/值对传递成为可能.除了支持函数参数外,该库还支持模板参数. Boost.Parameter 在您使用长参数列表并且参数的顺序和含义难以记住时特别有用.键/值对使得以任何顺序传递参数成为可能.因为每一个值都是通过一个键来传递的,所以各种值的含义也更加清晰. 二.示例代码 示例 53.1.作为键/值对的函数参数 #include <boost/parameter.hpp> #include <strin

  • C++ Boost Coroutine使用协程详解

    目录 一.说明语言扩展 二.库Boost.Coroutine 三.示例和代码 一.说明语言扩展 以下库扩展了编程语言 C++. Boost.Coroutine 使得在 C++ 中使用协程成为可能——其他编程语言通常通过关键字 yield 支持. Boost.Foreach 提供了一个基于范围的 for 循环,它是在 C++11 中添加到语言中的. Boost.Parameter 允许您以名称/值对的形式并以任何顺序传递参数——例如,这在 Python 中是允许的. Boost.Conversio

  • C++ Boost Foreach超详细分析讲解

    目录 一.说明 二.示例代码 2.1 最简单的代码 2.2 使用BOOST_FOREACH与BOOST_REVERSE_FOREACH 三.BOOST_FOREACH特点和应用范围 四.遍历循环控制 一.说明 Boost.Foreach Boost.Foreach 提供了一个宏来模拟 C++11 中基于范围的 for 循环.您可以使用在 boost/foreach.hpp 中定义的宏 BOOST_FOREACH 来迭代序列而不使用迭代器.如果你的开发环境支持C++11,可以忽略Boost.For

  • C++ Boost Atomic详细讲解

    目录 一.说明 二.示例和代码 一.说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量.它们被称为原子变量,因为所有访问都是原子的. Boost.Atomic 用于多线程程序,当在一个线程中访问变量不应被访问相同变量的另一个线程中断时.如果没有 boost::atomic,从多个线程访问共享变量的尝试将需要与锁同步. boost::atomic 取决于支持原子变量访问的目标平台.否则,boost::atomic 使用锁.该库允许您检测目标平台是否支持原子变量访

  • C++ Boost EnableIf函数使用介绍

    目录 一.说明 二.Boost.EnableIf的示例 练习 一.说明 Boost.EnableIf Boost.Enable If 可以禁用重载函数模板或专用类模板.禁用意味着编译器忽略相应的模板.这有助于防止出现模棱两可的情况,即编译器不知道要使用哪个重载函数模板.它还可以更轻松地定义不仅可用于特定类型而且可用于一组类型的模板. 从 C++11 开始,Boost.EnableIf 已经成为标准库的一部分.您可以在不使用 Boost 库的情况下调用本章介绍的函数:只需包含头文件 type_tr

  • C++ Boost Fusion创建异构容器详解

    目录 一.说明 二.示例和代码 一.说明 标准库提供了许多容器,它们有一个共同点:它们是同类的.也就是说,标准库中的容器只能存储一种类型的元素. std::vector<int> 类型的向量只能存储 int 值,而 std::vector<std::string> 类型的向量只能存储字符串. Boost.Fusion 使创建异构容器成为可能.例如,您可以创建一个向量,其第一个元素是 int,第二个元素是字符串.此外,Boost.Fusion 提供了处理异构容器的算法.您可以将 Bo

  • C++ Boost Exception超详细讲解

    Boost.Exception 库提供了一种新的异常类型 boost::exception,它允许您在抛出异常后将数据添加到异常中.此类型在 boost/exception/exception.hpp 中定义.由于 Boost.Exception 将其类和函数分布在多个头文件中,以下示例访问主头文件 boost/exception/all.hpp 以避免一个接一个地包含头文件. Boost.Exception 支持 C++11 标准的机制,该机制将异常从一个线程传输到另一个线程. boost::

  • C++ boost thread库用法详细讲解

    目录 一.说明 二.boost::thread的几个函数 三.构造 一.说明 boost::thread的六种使用方法总结,本文初步介绍线程的函数.构造.执行的详细解释. 二.boost::thread的几个函数 函数 功能 join() 让主进程等待子线程执行完毕后再继续执行 get_id() 获得线程的 id 号 detach() 标线程就成为了守护线程,驻留后台运行 bool joinable() 是否已经启动,为 join() thread::join()是个简单暴力的方法,主线程等待子

  • C++ Boost TypeTraits库使用详解

    目录 一.说明 二.库Boost.TypeTraits 一.说明 反省是重点中的重点,泛型在实践中贯穿工程的始终.以下库支持泛型编程.无需详细了解模板元编程即可使用这些库. Boost.TypeTraits 提供了检查类型属性的函数. Boost.EnableIf 可以与 Boost.TypeTraits 一起使用,例如,根据函数的返回类型重载函数. Boost.Fusion 使创建异构容器成为可能——其元素可以具有不同类型的容器. Boost.TypeTraits Boost.EnableIf

  • C++ Boost.Range与Adapters库使用详解

    目录 一.说明 二.适配器 练习 一.说明 本节叙述关于Boost.Range和Adeptor两个内容. Boost.Range 是一个库,乍一看,它提供的算法类似于标准库提供的算法.例如,您会发现函数 boost::copy(),它的作用与 std::copy() 相同.但是, std::copy() 需要两个参数,而 boost::copy() 需要一个范围. 二.适配器 标准库提供了几种可以传递谓词的算法.例如,传递给 std::count_if() 的谓词确定计算哪些元素. Boost.

  • C++ Boost Heap使用实例详解

    目录 一.说明Boost.Heap 二.功能示例 一.说明Boost.Heap Boost.Heap 也可以称为 Boost.PriorityQueue,因为该库提供了几个优先级队列.但是,Boost.Heap 中的优先级队列与 std::priority_queue 不同,它支持更多功能. 二.功能示例 示例 17.1.使用 boost::heap::priority_queue #include <boost/heap/priority_queue.hpp> #include <io

  • C++ Boost PointerContainer智能指针详解

    目录 一.提要 二.智能指针Boost.PointerContainer 三.练习 一.提要 在 C++11 中,Boost.PointerContainer是另一个智能指针,一般是用来生成集合数据的,本文阐述这种指针的特点和用法. 二.智能指针Boost.PointerContainer 库 Boost.PointerContainer 提供专门用于管理动态分配对象的容器.例如,在 C++11 中,您可以使用 std::vector<std::unique_ptr<int>> 创

  • Linux静态库与动态库实例详解

    Linux静态库与动态库实例详解 1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include "test.h" int main(){ test(); return 0; } // test.h #include<iostream> using namespace std; void test(); // test.c #include "test.h" void test(){ cout<< &quo

  • Python中logging日志库实例详解

    logging的简单使用 用作记录日志,默认分为六种日志级别(括号为级别对应的数值) NOTSET(0) DEBUG(10) INFO(20) WARNING(30) ERROR(40) CRITICAL(50) special 在自定义日志级别时注意不要和默认的日志级别数值相同 logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO.WARNING.ERROR.CRITICAL 级别的日志都会输出. |2logging常见对象 Logger:日志,

  • golang常用库之gorilla/mux-http路由库使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:golang自带路由介绍 golang自带路由库 http.ServerMux ,实际上是一个 map[string]Handler,是请求的url路径和该url路径对于的一个处理函数的映射关系.这个实现比较简单,有一些缺点: 不支持参数设定,例如/user/:uid 这种泛型类型匹配无法很友好的支持REST模式,无

  • Python 图片处理库exifread详解

    [导语]:用 python 怎样获得图片的GPS信息?今天推荐一下 exifread 这个神奇的库,不仅仅是 GPS 信息,几乎能能获得图片的所有信息,快进来看看!! 要怎样获得拍摄图片的GPS呢?这里我们需要exifread 库,这个就是用来提取 GPS 信息的.直接 pip install exifread 来安装就好了. 其实不仅能获得GPS信息,图片的几乎所有信息都能获得.exifread的作用其实是代替了查看图片属性!如下图: 这里用在三亚拍的骆驼照片来做个演示,看看能不能定位到三亚.

  • C++JSON库CJsonObject详解(轻量简单好用)

    1. JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集.许多编程语言都很容易找到JSON 解析器和 JSON 库. JSON 文本格式在语法上与创建 JavaScript 对象的代码相同.不同语言的不同json库对json标准的支持不尽相同,为了能让尽可能多的json库都能正常解析和生成json,定义JSON的规范很重要,推荐一个JSON规范<JSON风格指南

  • Golang标准库syscall详解(什么是系统调用)

    一.什么是系统调用 In computing, a system call is the programmatic way in which a computer program requests a service from the kernel of the operating system it is executed on. This may include hardware-related services (for example, accessing a hard disk dri

随机推荐