1.为什么system_error

"....report error conditions originating from the operating system or low-level application program interfaces."

报告源于操作系统低层程序接口错误。 更进一步说,< system_error >提供了用于报告该方面错误的异常机制,是<stdexcept>的扩展

2.怎么用system_error

物以类聚,功能也以“类”分。 刚看到这个头文件的内容,我也有点懵逼,让我们先理清类与类之间的关系:

虽然这几个类之间存在非常复杂的转换构造关系(实际上error_condition也可以通过error_category构造,但为了思路清晰,涂中没有给出),但我们记住一点----system_error是runtime_error的子类,是异常类。 因此在使用时,我们只要抓住system_error类就行了,构造并抛出

这里system_error主要有两种构造方法:

  • 借助error_code类构造
  • 借助error_condition类(通常通过errc枚举来构造)构造

这样一来我们的使用思路就很清晰了,都在图中,具体细节这里就不赘述了。

3.有趣的system_error

这里有个有趣的东西:

template <class T>
struct is_error_code_enum : public false_type {} template <class T>
struct is_error_condition_enum : public false_type {}

从名字就能推测出,这两个结构体用来控制其他类型到error_code和error_condition类型的自动转换。 说到自动转换,肯定是通过类的conversion constructor进行的。

那么问题就来了,想要能进行类型转换,肯定得定义一个转换构造器;如果不想,就不能定义。 但这里只通过显示特化上面两个类,就能实现上述行为,这是怎么做到的呢? 这利用了模板函数 对重载决议的影响,也就是SFINAE(Substitute Error Is Not An Error)。

3.1 SFINA

下面举个例子:

template <class T>
struct MyType
{
}; template <>
struct MyType<double>
{
typedef double type;
}; template <class T, class TT = typename MyType<T>::type>
void func(T t) { std::cout << "T" << std::endl; } int main()
{
int i; func(i); // ERROR!
func(12.3); // OK!
}

可以看到func模板函数有两个类型参数,以个为直接参数T,另一个为推导参数TT(为成员类型MyType< T >::type),这两个类型参数都需要在实例化时进行替换。 但是实际上我们只为MyType< double >类型定义了成员类型type,所以当函数func进行重载决议时发现MyType< int >类型没有成员类型type,无法对TT类型进行替换,因此签名为void func< int >(int t)的函数将会从重载函数集中去掉,结果就是不存在这样的重载函数, 上面的两个函数调用只有参数为double的能通过编译。

C++ 头文件系列(system_error)的更多相关文章

  1. C++ 头文件系列(array)

    注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...

  2. C++ 头文件系列(queue)

    简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...

  3. C++ 头文件系列(stack)

    简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...

  4. C++ 头文件系列(vector)

    简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...

  5. C++ 头文件系列(map)

    简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性 ...

  6. C++ 头文件系列(unordered_map、unordered_set)

    简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...

  7. C++ 头文件系列(iterator)

    简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...

  8. C++ 头文件系列 (algorithm)

    简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何 ...

  9. C++ 头文件系列 (bitset)

    简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...

随机推荐

  1. wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  2. 九度OJ题目1137:浮点数加法 (JAVA)使用BigDecimal四个案例都通过了,但是超时了。

    题目描述: 求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj 对于整数部分,P1P2...Pi是一个非负整数 对于小数部分,Qj不等于0 输入: ...

  3. js数组,字符串常用方法汇总(面试必备)

    字符串: 1.concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串.  2.indexOf() – 返回字符串中一个子串第一处出现的索引.如果没有匹配项,返回 -1 .  3.ch ...

  4. linux apache添加多站点配置(Ubuntn和Centos)

     Linux Apache 多站点配置 Centos 配置方式: 找到 /etc/httpd/conf/http.conf 添加监听端口,eg: Listen 89 虚拟机配置,一个端口对应一个 &l ...

  5. python+request接口自动化框架

    python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...

  6. HTML5学习笔记<二>:元素,属性,格式化

    HTML元素 元素是指从开始标签到结束标签的所有代码. 开始(开放)标签 元素内容 结束(闭合)标签 <p> this is my web page </p> 没有内容的 HT ...

  7. RabbitMQ-从基础到实战(4)— 消息的交换(下)

    0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) 1.简介 ...

  8. apache 配置多个版本的 php

    注:这里说的是windows环境下的配置 我们在配置apache+php的时候,是在apache的配置文件httpd.conf里加载php的模块并指定php.ini路径 LoadModule php5 ...

  9. flex中创建弹出窗口,并传值

    在flex页面中首先创建一个弹出窗口,代码如下: <?xml version="1.0" encoding="utf-8"?> <s:Titl ...

  10. python3编码问题终结者--还搞不懂你来找我

    python unicode bytes str 编码 首先需要说明一下,该篇文章是以python3为基础的,python2是否适合没有验证过.由于python编码问题确实比较多,文章篇幅可能较长,请 ...