any.h

来源:互联网 发布:测试网络摄像头软件 编辑:程序博客网 时间:2024/06/08 04:04

我认为这是写的非常漂亮的一个头文件,足够底层,足够抽象。由于我的能力有限,很难彻底地理解作者的思想,请大家见谅。

在any.h中,有一个名字空间anyimpl,这名字空间的内容为any类,提供一些基本功能的实现,让我们来一起看一看。

struct bad_any_cast;

该结构继承于std::runtime_error,用于出现any转换异常是抛出。

struct empty_any;

空any,nothing.

inline std::ostream & operator <<(std::ostream & out, const empty_any &);

重载操作符<<,返回一个输出为”[empyt_any]”的ostream的引用,具体有什么应用,到后面看到再补充。

struct base_any_policy{    virtual void static_delete(void** x) = 0;    virtual void copy_from_value(void const* src, void** dest) = 0;    virtual void clone(void* const* src, void** dest) = 0;    virtual void move(void* const* src, void** dest) = 0;    virtual void* get_value(void** src) = 0;    virtual ::size_t get_size() = 0;    virtual const std::type_info& type() = 0;    virtual void print(std::ostream& out, void* const* src) = 0;};

纯虚类,声明了若干种方法。

struct typed_base_any_policy;

该结构继承于base_any_policy.
其定义了一个虚方法

virtual ::size_t get_size();

其返回相关类型的大小,比如:

type_based_any_policy<char> a;a.get_size() == 1;

该结构并且声明了一个新方法

virtual const std::type_info& type(){ return typeid(T)};

返回结构特定的类型,这里只适用于基本类型。

下面两个结构:

struct small_any_policy;struct big_any_policy;

都继承于typed_base_any_policy,他们都定义实现了,base_any_policy中的各种方法,不同之处是small对应的浅拷贝,big对应的深拷贝(不懂为什么以small,big命名。。),所以他们在clone,move,static_delete上现实的方法又有所不同,大家仔细看看就会发现。

接下来就是choose_policy结构。

/// Choosing the policy for an any type is illegal, but should never happen./// This is designed to throw a compiler error.

功能介绍完毕。

方法:

base_any_policy* get_policy()

根据不同的类型返回选择不同policy。

class any

这个类没什么好分析的,大家看看源码就行了。

0 0