C++ Boost EnableIf函数使用介绍

目录
  • 一、说明
  • 二、Boost.EnableIf的示例
  • 练习

一、说明

Boost.EnableIf

Boost.Enable If 可以禁用重载函数模板或专用类模板。禁用意味着编译器忽略相应的模板。这有助于防止出现模棱两可的情况,即编译器不知道要使用哪个重载函数模板。它还可以更轻松地定义不仅可用于特定类型而且可用于一组类型的模板。

从 C++11 开始,Boost.EnableIf 已经成为标准库的一部分。您可以在不使用 Boost 库的情况下调用本章介绍的函数;只需包含头文件 type_traits。

二、Boost.EnableIf的示例

示例 49.1。在返回值上使用 boost::enable_if 重载函数

#include <boost/utility/enable_if.hpp>
#include <type_traits>
#include <string>
#include <iostream>
template <typename T>
typename boost::enable_if<std::is_same<T, int>, T>::type create()
{
  return 1;
}
template <typename T>
typename boost::enable_if<std::is_same<T, std::string>, T>::type create()
{
  return "Boost";
}
int main()
{
  std::cout << create<std::string>() << '\n';
}

Example49.1

示例 49.1 定义了函数模板 create(),它返回作为模板参数传递的类型的对象。该对象在 create() 中初始化,不接受任何参数。两个 create() 函数的签名没有区别。在这方面,create() 不是重载函数。如果 Boost.EnableIf 没有启用一个函数而禁用另一个,编译器将报告错误。

Boost.EnableIf 提供类 boost::enable_if,这是一个需要两个参数的模板。第一个参数是条件。如果条件为真,第二个参数是 boost::enable_if 表达式的类型。诀窍在于,如果条件为假,则此类型不存在,在这种情况下,boost::enable_if 表达式是无效的 C++ 代码。然而,当涉及到模板时,编译器不会抱怨无效代码。相反,它会忽略模板并搜索另一个可能适合的模板。这个概念被称为 SFINAE,它代表“替换失败不是错误”。

在示例 49.1 中,boost::enable_if 表达式中的两个条件都使用类 std::is_same。此类在 C++11 标准库中定义,允许您比较两种类型。因为这样的比较不是真就是假,所以使用 std::is_same 来定义条件就足够了。

如果条件为真,相应的 create() 函数应返回作为模板参数传递给 create() 的类型的对象。这就是 T 作为第二个参数传递给 boost::enable_if 的原因。如果条件为真,则整个 boost::enable_if 表达式将替换为 T。在示例 49.1 中,编译器会看到返回 int 的函数或返回 std::string 的函数。如果使用 int 或 std::string 以外的任何其他类型调用 create(),编译器将报告错误。

示例 49.1 显示提升。

示例 49.2。使用 boost::enable_if 为一组类型专门化函数

#include <boost/utility/enable_if.hpp>
#include <type_traits>
#include <iostream>
template <typename T>
void print(typename boost::enable_if<std::is_integral<T>, T>::type i)
{
  std::cout << "Integral: " << i << '\n';
}
template <typename T>
void print(typename boost::enable_if<std::is_floating_point<T>, T>::type f)
{
  std::cout << "Floating point: " << f << '\n';
}
int main()
{
  print<short>(1);
  print<long>(2);
  print<double>(3.14);
}

Example49.2

示例 49.2 使用 boost::enable_if 为一组类型特化一个函数。该函数称为 print() 并需要一个参数。它可以被重载,尽管重载要求您使用具体类型。要对一组类型(如 short、int 或 long)执行相同的操作,您可以使用 boost::enable_if 定义适当的条件。示例 49.2 使用 std::is_integral 来做到这一点。第二个 print() 函数为所有浮点数重载了 std::is_floating_point。

练习

使 print_has_post_increment() 写入标准输出,无论类型是否支持后增量运算符。例如,对于 int 程序应该输出“int has a post increment operator”:

#include <string>
template <class T>
void print_has_post_increment()
{
    // TODO: Implement this function.
}
int main()
{
    print_has_post_increment<int>();
    print_has_post_increment<long>();
    print_has_post_increment<std::string>();
}

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

时间: 2022-11-18

C++&nbsp;Boost&nbsp;shared_ptr共享指针详细讲解

目录 一.提要 二.智能指针boost::shared_ptr与boost::scoped_ptr 三.智能指针 boost::shared_ptr用法 示例1 示例2 示例3 示例4 示例5 一.提要 boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别. 二.智能指针boost::shared_ptr与boost::scoped_ptr 主要区别在于: boost::shared_ptr 不一定是对象的独占所有者. 所有权可以

C++&nbsp;Boost&nbsp;MPI接口详细讲解

目录 一.说明 二.开发和运行时环境 三.简单数据交换 一.说明 Boost.MPI 提供了 MPI 标准(消息传递接口)的接口.该标准简化了并发执行任务的程序的开发.您可以使用线程或通过共享内存或网络连接使多个进程相互通信来开发此类程序. MPI 的优点是你不需要关心这些细节.您可以完全专注于并行化您的程序. 缺点是您需要 MPI 运行时环境.如果您控制运行时环境,MPI 只是一个选项.例如,如果你想分发一个可以通过双击启动的程序,你将无法使用 MPI.虽然操作系统开箱即用地支持线程.共享内存

C++&nbsp;Boost&nbsp;Lambda表达式详解

目录 lambda表达式格式 说明Boost.Lambda lambda表达式格式 lambda表达式的格式 [捕捉列表](参数列表)mutable->返回值类型{ 语句部分 }; 其中参数列表.返回值类型是可选的,捕捉列表.函数体可以为空. 先来看一个较为简单的lamda表达式 int main(void) { auto add = [](int a, int b)->int {return a + b; }; cout << add(1, 2) << endl; r

C++&nbsp;Boost&nbsp;Lockfree超详细讲解使用方法

目录 一.说明 二.示例和代码 Boost.Lockfree 一.说明 Boost.Lockfree 提供线程安全和无锁容器.可以从多个线程访问此库中的容器,而无需同步访问. 在 1.56.0 版本中,Boost.Lockfree 只提供了两个容器:boost::lockfree::queue 类型的队列和 boost::lockfree::stack 类型的栈.对于队列,可以使用第二个实现:boost::lockfree::spsc_queue.此类针对只有一个线程写入队列和只有一个线程从队列

C++&nbsp;boost&nbsp;scoped_ptr智能指针详解

目录 一.智能指针-唯一所有者 二.接口类分析 一.智能指针-唯一所有者 boost::scoped_ptr 是一个智能指针,它是动态分配对象的唯一所有者. boost::scoped_ptr 无法复制或移动.此智能指针在头文件 boost/scoped_ptr.hpp 中定义. 二.接口类分析 scoped_array 分析 scoped_array 的类部分原始代码如下: template<class T> class scoped_array // noncopyable { priva

C++&nbsp;Boost&nbsp;Atomic详细讲解

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

C++&nbsp;Boost&nbsp;PointerContainer智能指针详解

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

C++智能指针详解

目录 一. unique_ptr独占指针 特点 创建方式 传递方式 简单使用 隐藏危险 二. shared_ptr 计数指针 特点 传递方式 隐藏危险 三. weak_ptr 优缺点: 智能指针由原始指针的封装,优点是可以自动分配内存,不用担心内存泄漏问题. 用于解决独占/共享所有权指针的释放,传输等问题. 但是没有原始指针方便. 一. unique_ptr独占指针 特点 都是围绕独占展开 特点一: 如其名,独占.也就是说同一个内存空间同时只能有一个指针来管理. int* pi = new in

C++学习之移动语义与智能指针详解

移动语义 1.几个基本概念的理解 (1)可以取地址的是左值,不能取地址的就是右值,右值可能存在寄存器,也可能存在于栈上(短暂存在栈)上 (2)右值包括:临时对象.匿名对象.字面值常量 (3)const 左值引用可以绑定到左值与右值上面,称为万能引用.正因如此,也就无法区分传进来的参数是左值还是右值. const int &ref = a;//const左值引用可以绑定到左值 const int &ref1 = 10;//const左值引用可以绑定到右值 (4)右值引用:只能绑定到右值不能绑

一篇文章带你了解C++智能指针详解

目录 为什么要有智能指针? 智能指针的使用及原理 RALL shared_ptr的使用注意事项 创建 多个 shared_ptr 不能拥有同一个对象 shared_ptr 的销毁 shared_ptr 的线程安全问题 shared_ptr 的循环引用 unique_ptr的使用 unique_ptr 总结 为什么要有智能指针? 因为普通的指针存在以下几个问题: 资源泄露 野指针 未初始化 多个指针指向同一块内存,某个指针将内存释放,别的指针不知道 异常安全问题 如果在 malloc和free 或

C++Smart&nbsp;Pointer&nbsp;智能指针详解

目录 一.为啥使用智能指针呢 二.shared_ptr智能指针 三.unique_ptr智能指针 四.weak_ptr智能指针 五.智能指针怎么解决交叉引用,造成的内存泄漏 5.1交叉引用的栗子: 5.2解决方案 六.智能指针的注意事项 总结 一.为啥使用智能指针呢 标准库中的智能指针: std::auto_ptr --single ownership (C++98中出现,缺陷较多,被摒弃) std::unique_ptr --single ownership (C++11替代std::auto

C语言指针详解及用法示例

新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法

C++ 中boost::share_ptr智能指针的使用方法

C++ 中boost::share_ptr智能指针的使用方法 最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论.当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述. 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中new了之后不用delete,智能指针自己会帮助你管理

C++中函数指针详解及代码分享

函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

C++ 中的this指针详解及实例

C++ this 指针详解 学习 C++ 的指针既简单又有趣.通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象. 全局仅有一个this指针,当一个对

C/C++静态类和this指针详解及实例代码

 C/C++静态类和this指针详解 1.静态类 C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问. class CBook{ public: static double price;//需要通过类外来进行初始化 } int main(void){ CBook book; book.price;//通过对象来访问 CBook::price//通过类名来访问 return 0; } 静态成员变量 对应静态成员有以下几点需要注意: (1)静态数据成员可以是当前类的类型,而其他数据成员

C++获取类的成员函数的函数指针详解及实例代码

C++获取类的成员函数的函数指针详解 用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} //static member void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member virtualvoid virtualmember(){cout<