前言
学习自用,帮助理解,有错麻烦提一下,代码没跑过,想着知道大概思想就好..
问题
-
为什么不用类型推断,类型推断又是什么TODO
-
类型擦除怎么实现的,用类的继承来实现的,为什么类的继承可以实现?
基类是不含模板参数的,派生类中才有模板参数,这个模板参数类型正是赋值的类型,在赋值时,将创建的派生类对象赋值给基类指针,基类的派生类中携带了数据类型,基类只是原始数据的一个占位符,通过多态,它擦除了原始数据类型,因此,任何数据类型都可以赋值给他,从而实现了能存放所有类型数据的目标
正文:std::any的实现
要用一个容器,可以装所有类型
-
Q:为什么不直接用void*
-
A:因为类型不安全
any类的API应该是:
-
初始化Any a(1);和Any b("字符串")
-
转换a.convert(std::string);即any_cast
这样是没有声明类型的,因为也不知道传过来的是什么类型,
用模板来定义,
template<typname ValueType>
class Any{
Any(ValueType value);//构造函数
NoType _content;//数据内容,这里应该定义成什么类型呢
Any& operator=(ValueType);
}
这里应该被定义成一个于类型无关的类,即要用到类型擦除,所以应该是NoType,这个NoType怎么来实现呢
用多态是一个方法,则改名Notype*,则Any构造函数