C++ 头文件系列(system_error)

1.为什么system_error

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

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

2.怎么用system_error

东西以类聚,功能吗因为“类”分。
刚看到此腔文件之始末,我啊生硌懵逼,让咱们先理清类与类似里的涉:

图片 1

尽管就几乎独八九不离十里是非常复杂的易构造关系(实际上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的能经过编译。