C++ Boost EnableIf函数使用介绍

 更新时间:2022年11月20日 16:17:53   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

一、说明

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++基于EasyX图形库实现2048小游戏

    C++基于EasyX图形库实现2048小游戏

    这篇文章主要为大家详细介绍了C++基于EasyX图形库实现2048小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++ move semantic移动语义介绍

    C++ move semantic移动语义介绍

    首先,移动语义和完美转发这两个概念是在C++的模板编程的基础上,新增的特性,主要是配合模板来使用。本篇会从C++的值类型,到移动拷贝与移动赋值来理解移动语义与完美转发
    2022-08-08
  • C++服务器和客户端交互的项目实践

    C++服务器和客户端交互的项目实践

    本文主要介绍了C++服务器和客户端交互的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++中的字符串编码处理方法

    C++中的字符串编码处理方法

    这篇文章主要介绍了C++中的字符串编码处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 关于C++菱形运算符深度解析

    关于C++菱形运算符深度解析

    从语言标准来说,c++里没有什么菱形运算符,c++20里虽然新增了一个运算符operator<=>,但这个和所谓的菱形运算符没有任何关系,下面通过本文探讨C++里也有菱形运算符吗这一问题探讨,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Qt重写QTreeView自绘实现酷炫样式

    Qt重写QTreeView自绘实现酷炫样式

    QTreeView,顾名思义,就是一种树形的控件,在我们需要做类似于文件列表的视图时,是一个不错的选择,下面我们就来看看qt如何重写QTreeView实现酷炫样式,感兴趣的可以了解一下
    2023-08-08
  • C语言详细讲解注释符号的使用

    C语言详细讲解注释符号的使用

    C语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使翻译跳过不作处理
    2022-04-04
  • C++ Boost Heap使用实例详解

    C++ Boost Heap使用实例详解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • c++中vector<int>和vector<int*>的用法及区别

    c++中vector<int>和vector<int*>的用法及区别

    这篇文章主要介绍了c++中vector<int>和vector<int*>的用法及区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2013-10-10
  • C语言实现文件读写操作的几种常用方法

    C语言实现文件读写操作的几种常用方法

    C语言提供了一系列文件操作函数,使得我们可以通过程序对文件进行读写操作,本文主要介绍了C语言实现文件读写操作的几种常用方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论